2012-10-16 5 views
78

私は、Pythonに新たなんです。私は空の辞書を持っているPythonの辞書には、どのようにキーを作成したり、要素がキーに追加するには?

:だけでなく、私は、その機能を学習タイプと、そのような、だけでなく、私は、それゆえ私の質問に物事を行うとするPython的の方法を学ぶことを試みているのです。名前:dict_x それは値がリストされているの鍵を持っていることです。別の反復から

、Iキー(例:key_123)を取得し、dict_xの値key_123のリストに配置する項目(タプル)。

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

それが存在するため、再びこのキーは、私は値を再度追加したい、アップします。

私のコードは次から構成されています

は、キーと値を取得します。

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

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

dict_x[key].append(value)

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

答えて

126

使用dict.setdefault()

dic.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 
+3

私はdict_x [キー] = [some_value] dict_x.has_keyない場合(キー)他のdict_x 'によってこれを行うために使用されます[キー] + [some_value] 'しかし、この答えははるかに良い方法を示唆している。実際には引数として 'set()'を取得し、 'add()'メソッドを使うことができます... –

7

あなたはcollectionsdefaultdictを使用することができます。

ドキュメントからの例:

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

あなたはこのためにdefaultdictを使用することができます。あなたが使用して終了していない新しいリストを作成して終了していないので、

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

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

30

これを行うさまざまな方法がありますので、見た目を比較して好きなものを選ぶことができます。私は最も「神託」だと思う方法でそれらを命じた、と一見明白ではないかもしれません長所と短所をコメントしました:

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] 
+0

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

+1

'.setdefault()'は不要な辞書を作成するとは思わない。私は '' key''がすでに存在する場合には使用されない '.setdefault()'の2番目の引数に不要な 'list's(つまり' [] ')を作成していると思います。私は 'dict.setdefault()'(効率的なキーハッシュのために)を使用して、未使用の 'list'sを再利用するために変数を使用することができますが、それはコードのいくつかの行を追加します。 – antak

+0

IIRC、Pythonでは、等価の空リストはバイトコードレベルでは定数と見なされますが、これはバイトコードの指導者による確認が必要です(またはdisasモジュールを使用するだけです)。 – gaborous

関連する問題