web-dev-qa-db-ja.com

Pythonキーの作成方法またはキーへの要素の追加方法を指示しますか?

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

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

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

将来、このキーが再び表示されるとき、存在するため、値を再度追加する必要があります。

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

キーと値を取得します。

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

そして、それを作成しない場合:dict_x[key] == []

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

これはそれを行う方法ですか? try/exceptブロックを使用しようとしますか?

118
Phil

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
193

これを行うためのさまざまな方法がありますので、見た目を比較して好きなものを選択できます。私は最も "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()sの非効率的な作成。

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]
51
antak

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

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

これは、setdefaultよりもわずかに効率的です。これは、使用しない新しいリストを作成しないためです。 setdefaultを呼び出すたびに、アイテムが辞書に既に存在する場合でも、新しいリストが作成されます。

19

collectionsdefaultdict を使用できます。

Docからの例:

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