web-dev-qa-db-ja.com

キーでdefaultdictを初期化する方法は?

リストのディクショナリがあり、デフォルトのキーで初期化する必要があります。おそらく、以下のコードは適切ではありません(つまり、動作しますが、Pythonのように記述されているとは思わない)。

d = {'a' : [], 'b' : [], 'c' : []}

だから私はdefaultictのようなよりPythonicなものを使いたいです:

d = defaultdict(list)

ただし、私が見たすべてのチュートリアルは、新しいキーを動的に設定します。しかし、私の場合、すべてのキーは最初から定義する必要があります。他のデータ構造を解析していて、構造内の特定のキーがディクショナリにも含まれている場合にのみ、ディクショナリに値を追加します。

デフォルトのキーを設定するにはどうすればよいですか?

11
Amir

それはすでに合理的ですが、標準のキーのリストを使用するdict内包表記で少し短くすることができます。

>>> standard_keys = ['a', 'b', 'c']
>>> d1 = {key:[] for key in standard_keys}
>>> d2 = {key:[] for key in standard_keys}
>>> ...
6
tdelaney

近いキーセット(例では['a'、 'b'、 'c'])を使用していることがわかっている場合は、上記の答えを間違いなく使用できます。

だが...

dd = defaultdict(list)はさらに多くの機能を提供します:d = {'a':[], 'b':[], 'c':[]}appendからdefaultdictの「存在しない」キーまで:

>>dd['d'].append(5)
>>dd
>>defaultdict(list, {'d': 5})

ここであなたがする場合:

>>d['d'].append(5)  # you'll face KeyError
>>KeyError: 'd'

次のようなことをお勧めします:

>>d = {'a' : [], 'b' : [], 'c' : []}
>>default_d = defaultdict(list, **d)

これで、3つのキーを保持する辞書があります:['a'、 'b'、 'c']および値としての空のリストand明示的に記述せずに他のキーに追加することもできます:d['new_key'] = []追加する前

3
Aaron_ab

空のリストに事前初期化する場合は、defaultdictは必要ありません。シンプルなdict-comprehensionは仕事を明確にそしてきれいに行います:

>>> {k : [] for k in ['a', 'b', 'c']}
{'a': [], 'b': [], 'c': []}
2

コメントから、私はあなたが次の条件に合う辞書が欲しいと思っています:

  1. それぞれに空のリスト値を持つキーのセットで初期化されます
  2. 存在しないキーの空のリストを初期化できるdefaultdict動作があります

@Aaron_labには正しい方法がありますが、少しすっきりした方法があります。

d = defaultdict(list,{ k:[] for k in ('a','b','c') })
2
dexgecko

プリセットキーを使用してdictを返す関数を定義できます。

_def get_preset_dict(keys=['a','b','c'],values=None):
    d = {}
    if not values:
        values = [[]]*len(keys)
    if len(keys)!=len(values):
        raise Exception('unequal lenghts')
    for index,key in enumerate(keys):
        d[key] = values[index]

    return d
_

[8]:get_preset_dict()

Out [8]:_{'a': [], 'b': [], 'c': []}_

[18]で:get_preset_dict(keys = ['a'、 'e'、 'i'、 'o'、 'u'])

Out [18]:_{'a': [], 'e': [], 'i': [], 'o': [], 'u': []}_

[19]内:get_preset_dict(keys=['a','e','i','o','u'],values=[[1],[2,2,2],[3],[4,2],[5]])

Out [19]:_{'a': [1], 'e': [2, 2, 2], 'i': [3], 'o': [4, 2], 'u': [5]}_

1
harshil9968