2017-12-19 32 views
1

を作成していない私はthisを読みましたが、私のために動作するようには思えない -のpython - 値としてタプルの集合と辞書が正しく

>>> dict = {} 
>>> dict[ "a" ] = set(("1111","test1")) 
>>> dict 
{'a': set(['1111', 'test1'])} 
>>> dict[ "a" ].add(("2222","test2")) 
>>> dict 
{'a': set(['1111', 'test1', ('2222', 'test2')])} 

私はタプルのように見えることも最初のものを期待していました - どうしてそれは分かれているのですか?

やったときに私がしたい:

>>> for key,val_set in dict.items() : 
...  for val in val_set : 
...    print val 
... 
1111 
test1 
('2222', 'test2') 

ではなく3印刷された2つの項目を持っています。

+2

タプルはセットに変換されます。 'set([(" 1111 "、" test1 ")])' –

+2

'set([(" 1111 "、" test1 ")])'おそらく? –

+1

あなたはあなたの答えを持っていますが、私はあなたがdefaultdict(set)を使うようアドバイスします。それは簡単で実際のアプローチです。 – Sagar

答えて

4

set()は、から値をとり、それぞれの値を別々に加算します。あなたは2つの値を持つ繰り返し可能なタプルを渡しました。

あなたはタプル自体を追加したい場合は、反復可能で、リストのようにすることをラップする必要があります:Pythonの3では

set([("1111","test1")]) 

、あなたが代わりに新しいを作成するために設定された表示を使用することができます設定:

{("1111","test1")} 

セット表示は、カンマで区切られた要素を受け取り、("1111", "test1")、ここで1組の要素です。他のポストで

は、セットが設定された表示(SO {tuple1, tuple2, etc.})と処理するset()機能のためにタプルのシーケンスを生成するitertools関数またはgenerator expressionのいずれかを使用する回答を使用して作成しました。どちらも繰り返し可能な型を生成します。

2

答えがありましたが、代わりにdefaultdictを使用するようアドバイスします。このセット([( "1111"、 "test1")])のようなこれらのタイプのケースはすべて適切に処理されます。初期化についても心配する必要はありません。

お試しください。

from collections import defaultdict 
s = defaultdict(set) 
s["a"].add(("pw", "sq")); 
s["a"].add(("wq", "qq")); 
s["a"].add(("aa", "bb")); 

for k, v in s.items(): 
    print (k) 
    for g in v: 
     print (g) 

これに注意してください。私はあなたのキーと反対の値はすべてセットであると仮定しています。 これが当てはまらない場合は、最初のものに進みます。

関連する問題