2017-08-30 116 views
0

考慮一個點燃即白/黑,具有或不具有3G,帶或不帶特殊優惠:動態填充ND字典

Color: White 
Connectivity: Wi-Fi + Free 3G 
Offer Type: With Special Offers 
$127.49 

或光開關,其爲白色或杏仁,1包或10包:

Color: White 
Size: 1 Pack 
$10.00 

我想存儲各種產品的各種選項的價格。對於交換機,它看起來是這樣的:

product = { 
    'Color': 
     {'White': 
      {'Size': 
       {'1 Pack': 
        {'Price': '10.0'} 
      }, 
       {'10 Pack': 
        {'Price': '100.0'} 
      } 
     }, 
     'Almond': 
      {'Size': 
       {'1 Pack': 
        {'Price': '10.0'} 
      }, 
       {'10 Pack': 
        {'Price': '100.0'} 
      } 
     } 
     } 
    } 

什麼是動態填充值的字典的選項的選項數目可變的最佳方式?或者理想情況下不需要非默認庫的其他解決方案。到目前爲止,我最好的猜測是一堆的if語句來處理每個可能的長度...

product = {} 
if len(options) == 3: 
    product.update({options[0]:{}}) 
    product[options[0]].update({options[1]:{}}) 
    product[options[0]][options[1]].update({options[2]:{'Price':price}}) 
... 

注:據我所知,「價格」關鍵是沒有必要的。

回答

0

找到足夠接近我需要的東西。下面的代碼可能無法正常工作,但它與我所擁有的非常接近。

from pprint import pprint 

def set_nested(dic, value, *path): 
    for level in path[:-1]: 
     dic = dic.setdefault(level, {}) 

    dic[path[-1]] = value 

vals = [] 
for option in product_listing: 
    vals.append(get_option_name(option)) 
set_nested(costs, price, *vals) 
print costs 

{'Black': {'Wi-Fi + Free 3G': {'With Special Offers': 101.0, 
           'Without Special Offers': 209.99}, 
      'Wi-Fi Only': {'With Special Offers': 100.0, 
          'Without Special Offers': 100.0}}, 
'White': {'Wi-Fi + Free 3G': {'With Special Offers': 127.49, 
           'Without Special Offers': 209.99}, 
      'Wi-Fi Only': {'With Special Offers': 100.0, 
          'Without Special Offers': 139.99}}}