这是一种最佳实践问题。表现很重要。
我有一个字符串列表,字符串数不是一个常数(可能会从查询更改为查询)。我希望创建一个这些字符串的字典作为键,并为它们提供一个静态值(对于列表中的所有键,它是常量并且相同)。像:
my_keys = ['AKey', 'AnotherKey', 'OneMore']
default_Value = dict({'count':0, 'basePrice': 0})
预期产出:
{'AKey': {'count':0, 'basePrice': 0}, 'AnotherKey': {'count':0, 'basePrice': 0}, 'OneMore': {'count':0, 'basePrice': 0}}
每个值字典({'count':0, 'basePrice': 0}
)必须是单独的对象,而不是单个字典对象的引用。
我正在寻找除了 for
循环之外的东西。
我尝试了以下操作,当密钥数量已知时,它可以正常工作。
dict(zip(my_keys, [dict(), dict(), dict()]))
但由于my_keys
中的项目数量会发生变化,因此这种方法会失败。
答案 0 :(得分:4)
你无法避免循环;字典理解是从具有可变值的键序列创建字典的最佳实践:
{key: {'count':0, 'basePrice': 0} for key in my_keys}
对于Python 2.6及更早版本,请使用生成器表达式和dict()
构造函数:
dict((key, {'count':0, 'basePrice': 0}) for key in my_keys)
为了完成起见,对于不可变的默认值,dict.fromkeys()
是更好,更快的替代方案。
答案 1 :(得分:2)
你可以通常使用dict理解:
{key: default_Value.copy() for key in my_keys}
请注意,您需要复制default_value
以避免为所有密钥重复使用相同的dict实例。
答案 2 :(得分:2)
如其他答案所示,浅层副本可能不够好:
>>> from copy import deepcopy
>>> my_keys = ['AKey', 'AnotherKey', 'OneMore']
>>> default_Value = dict({'count':0, 'basePrice': 0})
>>> {k: deepcopy(default_Value) for k in my_keys}
{'OneMore': {'count': 0, 'basePrice': 0}, 'AKey': {'count': 0, 'basePrice': 0}, 'AnotherKey': {'count': 0, 'basePrice': 0}}
这假设您事先并不了解default_Value
,例如。您可以直接将{'count':0, 'basePrice': 0}
插入字典理解中,如@MartijnPieters所示,在这种情况下会更好
根据@gnibbler的建议,在dict comp中使用pickle.loads
可能会更快。
>>> import pickle
>>> default_Value = dict({'count':0, 'basePrice': 0})
>>> _default_Value = pickle.dumps(default_Value)
>>> {k: pickle.loads(_default_Value) for k in my_keys}
{'OneMore': {'count': 0, 'basePrice': 0}, 'AKey': {'count': 0, 'basePrice': 0}, 'AnotherKey': {'count': 0, 'basePrice': 0}}
答案 3 :(得分:0)
有什么问题
dct = defaultdict(lambda: {'count':0, 'basePrice': 0})
说明:使用您不使用的值预先填充dict是没有意义的。如果你这样做,defaultdict
将为你动态创建它们。我认为任何事情都无法击败这种表现。
答案 4 :(得分:-1)
dict(itertools.product(my_keys,[default_Value]))