2017-08-30 115 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}}}