web-dev-qa-db-ja.com

Python文字列を文字列のセットにマップする辞書?

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ユーザーです)この問題。)

15
Ellie P.

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
_
28
sth
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)
26

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(): 
_

代わりに。

6
unutbu

試してください:

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
1
Dawid

問題はこれです:

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」)だけが返され、変数keyvalueにアンパックしようとしています。 「foo」をアンパックすると、「f」、「o」、「o」が得られます。これは、1つの値が多すぎて2つの変数に収まらないため、ValueErrorになります。

他の人が述べたように、あなたが望むのは次のように辞書のキーと値のペアを繰り返すことです:

for key, value in Word_dict.iteritems (): 
1
zenbot