Pythonはどのようにキーを作成するか、キーに要素を追加するのか?


161

空の辞書があります。名前:dict_x それは値がリストであるキーを持つことです。

別のイテレーションから、キー(ex:)key_123とアイテム(タプル)を取得して、dict_xの値のリストに配置しますkey_123

このキーが既に存在する場合は、このアイテムを追加します。このキーが存在しない場合は、空のリストで作成してから追加するか、タプルを含むだけで作成します。

今後またこのキーが出てくると存在するので、再度値を追加して欲しいです。

私のコードはこれで構成されています:

キーと値を取得します。

NOTキーがに存在するかどうかを確認しdict_xます。

作成しない場合: dict_x[key] == []

その後: dict_x[key].append(value)

これはそれを行う方法ですか?try/exceptブロックを使ってみませんか?

回答:


253

使用dict.setdefault()

dic.setdefault(key,[]).append(value)

help(dict.setdefault)

    setdefault(...)
        D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D

4
私は以前これを行っていましたdict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value]が、この答えははるかに良い方法を示唆しています。実際、それはset()引数として取得され、add()メソッドの使用を許可します...
fatih_dur

66

これを行うためのさまざまな方法を以下に示します。これにより、外観を比較し、好きなものを選択できます。私はそれらを最も「パイソン的」であると思う方法で注文し、一見では明らかではないかもしれない長所と短所にコメントしました:

使用collections.defaultdict

import collections
dict_x = collections.defaultdict(list)

...

dict_x[key].append(value)

長所:おそらく最高のパフォーマンス。短所:Python 2.4.xでは使用できません。

使用dict().setdefault()

dict_x = {}

...

dict_x.setdefault(key, []).append(value)

短所:未使用list()のの非効率的な作成。

使用try ... except

dict_x = {}

...

try:
    values = dict_x[key]
except KeyError:
    values = dict_x[key] = []
values.append(value)

または:

try:
    dict_x[key].append(value)
except KeyError:
    dict_x[key] = [value]

こんにちは、なぜ.setdefaultが不要な辞書を作成すると思いますか?
Phil

2
.setdefault()不要な辞書を作成することはないと思います。私は思う私は不必要な作成listの(すなわち[]の第二引数で).setdefault()場合に使用されることはありませんだということをkeyすでに存在しています。私は使用することができますdict.setdefault()(効率的なキーハッシュの利益のために)、および未使用、再利用するために変数を使用するlistのをそれは、コードのいくつかのより多くの行を追加します。
antak '17

1
IIRC、Pythonでは、等価の空のリストはバイトコードレベルで定数と見なされますが、これにはバイトコードの第一人者による確認が必要です(または単にdisasモジュールを使用します)。
精巧な2015

使用すると、.setdefault定期的に作成し、dict不在のキールックアップがになりますどこKeyErrorしばらくはcollections.defaultdict(list)作成dict不在キーのルックアップを空を挿入しますlist私はあなたがあなたが望むどの動作に基づいて選択するべきだと思います-
Chris_Rands

自分のコードでcollections.defaultdictに似たものを試しましたが、予期しない副作用がありました。たとえば、次のIDLE交換を考えてみます。>>> list_dict = defaultdict(list)>>> len(list_dict)0 >>> len(list_dict [0])0 >>> len(list_dict)1 Pythonが呼び出すと、デフォルト値は、積極的に設定せずにキーをディクショナリに追加します。デフォルトを頻繁に使用すると、空のリストが多数作成されます。非効率的ですがうまくいけばより予測可能になるように、辞書用の独自のラッパー関数をロールします。
RDBury

26

これにはdefaultdictを使用できます。

from collections import defaultdict
d = defaultdict(list)
d['key'].append('mykey')

これは、setdefault最終的に使用しない新しいリストを作成することにならないため、少し効率的です。setdefault項目がすでに辞書に存在する場合でも、を呼び出すたびに新しいリストが作成されます。


14

defaultdictを使用できますcollections

docの例:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)

0
dictionary['key'] = dictionary.get('key', []) + list_to_append

1
特定の例外が存在する場合の利点(非常にマイナー)を説明する必要があります。単なるコードとして、なぜ追加の答えが必要なのかは明らかではありません。
Davis Herring

こんにちは、追加のインポートなしの代替案です。これは明らかにif文で行うことができます。私は、dict []を使用する代わりに、.get()の機能を使用する代替案を提案しています。
Tomas Silva Ebensperger

上位2つの回答は、インポートを行わない2つの異なる方法に言及しています(ただし、ではありませんdict.get)。
Davis Herring
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.