2012-02-25 13 views
2

私は辞書dを持っています。いくつかの重要なkeyの下に要素を追加する場合、私は2例key in dnot key in d考慮してください。セットの辞書に要素を追加する

from random import randint 

for i in range(1000): 
    key = randint(0, 100) 

    if key in d: 
     d[key] |= set([randint(0, 10)]) 
    else: 
     d[key] = set([randint(0, 10]) 

これを行うにはクリーンな方法はありますか? 2つのケースを統一できますか?

答えて

6

私はあなたがまだ定義されていないキーを参照する場合、デフォルトのオブジェクトを作成した辞書の一種である、defaultdictを使って好き:from collections import defaultdict

>>> from random import randint 
>>> from collections import defaultdict 
>>> 
>>> d = defaultdict(set) 
>>> 
>>> for i in range(10): 
...  el = randint(0, 5) 
...  d[el].add(randint(0,10)) 
... 
>>> d 
defaultdict(<type 'set'>, {0: set([2]), 1: set([7]), 2: set([8, 9, 5, 7]), 
3: set([1]), 4: set([1, 3, 4])}) 
>>> d[0] 
set([2]) 
>>> d[2] 
set([8, 9, 5, 7]) 
+0

ニースに役立ちます!これは私が欲しがっていたかったものです。 – Randomblue

+0

@Randomblue彼の答えを受け入れるようにしてください! – smessing

+0

私はあまりにも笑を提出しようとしていたようにガー右 – jdi

0

[defaultdict](http://docs.python.org/library/collections.html#collections.defaultdict)のを試してみてくださいdefaultdictは "default factory"パラメータをとります。基本的には、まだ初期化されていないキーのデフォルト値を設定することができます。

ddefaultdictの場合、この例では、if el in dのチェックを行う必要はありません。そのチェックはまだ基本的に次のようになりますd[el] |= set([randint(0, 10)])をやって、False返すだろうが、el場合dになっていないでした。

d[el] = set([]) 
d[el] |= set([randint(0, 10)]) 

ホープこれは

+0

提案の最初の部分は良いですが、彼は別のセットを作成し、そのように追加する必要はありません。単にadd()メソッドを呼び出してオーバーヘッドを節約することができます。 – jdi

+0

私は「フードの下で」起こっていることの一例として、それを意味していました。彼はそうすることをお勧めしません。 – inspectorG4dget

関連する問題