Python辞書を文字列をキーとして、文字列のセットを値として使用して辞書を作成できるようにしたいと思います。例:{ "crackers" : ["crunchy", "salty"] }
リストではなくセットでなければなりません。
しかし、私が次のことを試みると:
Word_dict = dict()
Word_dict["foo"] = set()
Word_dict["foo"] = Word_dict["foo"].add("baz")
Word_dict["foo"] = Word_dict["foo"].add("bang")
私は得ます:
Traceback (most recent call last):
File "process_input.py", line 56, in <module>
test()
File "process_input.py", line 51, in test
Word_dict["foo"] = Word_dict["foo"].add("bang")
AttributeError: 'NoneType' object has no attribute 'add'
私がこれをすると:
Word_dict = dict()
myset = set()
myset.add("bar")
Word_dict["foo"] = myset
myset.add("bang")
Word_dict["foo"] = myset
for key, value in Word_dict:
print key,
print value
私は得ます:
Traceback (most recent call last):
File "process_input.py", line 61, in <module>
test()
File "process_input.py", line 58, in test
for key, value in Word_dict:
ValueError: too many values to unpack
Python=私がやりたいことを実行するように強制する方法に関するヒントはありますか?私は中間者Pythonユーザーです)この問題。)
set.add()
は新しいset
を返さず、呼び出されたset
を変更します。次のように使用します。
_Word_dict = dict()
Word_dict["foo"] = set()
Word_dict["foo"].add("baz")
Word_dict["foo"].add("bang")
_
また、for
ループを使用してdictを反復する場合、キーを反復します。
_for key in Word_dict:
print key, Word_dict[key]
_
または、Word_dict.items()
またはWord_dict.iteritems()
を反復処理することもできます。
_for key, value in Word_dict.items():
print key, value
_
from collections import defaultdict
Word_dict = defaultdict(set)
Word_dict['banana'].add('yellow')
Word_dict['banana'].add('brown')
Word_dict['Apple'].add('red')
Word_dict['Apple'].add('green')
for key,values in Word_dict.iteritems():
print "%s: %s" % (key, values)
Word_dict["foo"].add("baz")
と言うときは、セットWord_dict ["foo"]に 'baz'を追加しています。
関数はNone
を返します-セットの更新は副作用です。そう
_Word_dict["foo"] = Word_dict["foo"].add("baz")
_
最終的に_Word_dict["foo"]
_をNone
に設定します。
ただWord_dict["foo"].add("baz")
が正しいでしょう。
2番目のシナリオでは、
_for key, value in Word_dict:
_
正しい構文は次のとおりであるため、エラーが発生します
_for key in Word_dict:
_
_Word_dict
_のキーだけをループします。この状況では、
_for key,value in Word_dict.iteritems():
_
代わりに。
試してください:
Word_dict = dict()
myset = set()
myset.add("bar")
Word_dict["foo"] = myset
myset.add("bang")
Word_dict["foo"] = myset
for key in Word_dict:
print key, Word_dict[key]
標準の辞書反復子はkey
のみを返し、タプルは返さないようです。
証明:
>>> d = { 'test': 1 }
>>> for k, v in d: print k, v
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> for k in d: print d[k]
...
1
問題はこれです:
Word_dict["foo"] = Word_dict["foo"].add("baz")
Word_dict["foo"].add("baz")
を呼び出すと、Word_dict["foo"]
が参照するセットが変更され、その操作はNone
を返します。したがって、ステートメントを右から左に読むと、Word_dict["foo"]
によって参照されるセットに "baz"が追加され、その演算の結果(つまり、None
)がWord_dict["foo"]
に設定されます。
したがって、これを期待どおりに機能させるには、ステートメントからWord_dict["foo"] =
を削除するだけです。
辞書はデフォルトでキーを反復処理するため、これを試すValueError:
for key, value in Word_dict:
ここで何が起こっているのかというと、Word_dictを反復すると、キー(たとえば「foo」)だけが返され、変数key
&value
にアンパックしようとしています。 「foo」をアンパックすると、「f」、「o」、「o」が得られます。これは、1つの値が多すぎて2つの変数に収まらないため、ValueErrorになります。
他の人が述べたように、あなたが望むのは次のように辞書のキーと値のペアを繰り返すことです:
for key, value in Word_dict.iteritems ():