在Python中使用字典中的特定值初始化未知数量的键

时间:2013-05-07 12:22:09

标签: python python-2.7 dictionary

这是一种最佳实践问题。表现很重要。

我有一个字符串列表,字符串数不是一个常数(可能会从查询更改为查询)。我希望创建一个这些字符串的字典作为键,并为它们提供一个静态值(对于列表中的所有键,它是常量并且相同)。像:

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中的项目数量会发生变化,因此这种方法会失败。

5 个答案:

答案 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]))