1

这是一种最佳实践问题。性能很重要。

我有一个字符串列表,字符串的数量不是一个常数(可能会因查询而异)。我希望将这些字符串的字典创建为键,并为它们分配一个静态值(该值是恒定的,并且对于列表中的所有键都相同)。喜欢:

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会改变,这种方法失败了。

4

5 回答 5

5

你无法避免循环;字典理解是从具有可变值的键序列创建字典的最佳实践:

{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()更好更快的选择。

于 2013-05-07T12:28:51.613 回答
2

dict 理解是您通常会使用的:

{key: default_Value.copy() for key in my_keys}

请注意,您需要复制default_value以避免相同的 dict 实例被所有键重用。

于 2013-05-07T12:25:17.917 回答
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 所建议的那样,pickle.loads在 dict comp 中使用它可能会更快。

>>> 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}}
于 2013-05-07T12:30:14.257 回答
0

有什么问题

dct = defaultdict(lambda: {'count':0, 'basePrice': 0})

说明:用您不使用的值预先填充 dict 是没有意义的。如果你这样做了,defaultdict会即时为你创建它们。我认为没有任何东西可以击败这种性能。

于 2013-05-07T12:28:48.623 回答
-1
dict(itertools.product(my_keys,[default_Value]))
于 2013-05-07T12:38:35.167 回答