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

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 に答える
2

辞書内包表記は、通常、これに使用するものです。

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

default_value同じ dict インスタンスがすべてのキーで再利用されるのを避けるために、コピーする必要があることに注意してください。

于 2013-05-07T12:25:17.917 に答える
-1
dict(itertools.product(my_keys,[default_Value]))
于 2013-05-07T12:38:35.167 に答える