202

私は空の辞書を持っています。名前:dict_x 値がリストであるキーを持つことです。

別の繰り返しから、キー (例: key_123) と項目 (タプル) を取得して、dict_xの value のリストに配置しますkey_123

このキーが既に存在する場合は、この項目を追加します。このキーが存在しない場合は、空のリストで作成してから追加するか、タプルを使用して作成します。

将来、このキーが再び表示されたときに、存在するので、値を再度追加したいと思います。

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

キーと値を取得します。

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

そうでない場合は作成します:dict_x[key] == []

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

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

4

5 に答える 5

339

使用dict.setdefault():

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

ヘルプ (dict.setdefault) :

    setdefault(...)
        D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
于 2012-10-16T00:43:35.667 に答える
85

さまざまな方法がありますので、見た目を比較して好みの方法を選択してください。私はそれらを最も"pythonic"だと思う方法で注文し、一見すると明らかではないかもしれない長所と短所をコメントしました:

使用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]
于 2012-10-16T01:19:57.823 に答える
33

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

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

setdefaultこれは、最終的に使用しない新しいリストを作成することにならないため、わずかに効率的です。アイテムがすでにディクショナリに存在する場合でも、を呼び出すたびsetdefaultに新しいリストが作成されます。

于 2012-10-16T00:47:24.243 に答える
16

でdefaultdictを使用できますcollections

ドキュメントからの例:

s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)
于 2012-10-16T00:45:42.793 に答える