将字符串映射到一组字符串的Python字典?

Ell*_* P. 15 python dictionary set

我希望能够创建一个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")
Run Code Online (Sandbox Code Playgroud)

我明白了:

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'
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

  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
Run Code Online (Sandbox Code Playgroud)

我明白了:

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
Run Code Online (Sandbox Code Playgroud)

关于如何强迫Python做我喜欢的任何提示?我是一个中级Python用户(或者我想,直到我遇到这个问题.)

sth*_*sth 28

set.add()不会返回一个新的set,它会修改set它被调用.用这种方式:

word_dict = dict()
word_dict["foo"] = set()
word_dict["foo"].add("baz")                                    
word_dict["foo"].add("bang")
Run Code Online (Sandbox Code Playgroud)

此外,如果您使用for循环迭代dict,则迭代键:

for key in word_dict:
   print key, word_dict[key]
Run Code Online (Sandbox Code Playgroud)

或者你可以迭代word_dict.items()word_dict.iteritems():

for key, value in word_dict.items():
   print key, value
Run Code Online (Sandbox Code Playgroud)


Jon*_*erg 26

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)
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 6

当你说word_dict["foo"].add("baz"),你正在将'baz'添加到set word_dict ["foo"]中.

函数返回None- 更新集合是副作用.所以

word_dict["foo"] = word_dict["foo"].add("baz") 
Run Code Online (Sandbox Code Playgroud)

最终将word_dict["foo"]None.

只是word_dict["foo"].add("baz")这是正确的.

在第二种情况下,当你说

for key, value in word_dict:                                                       
Run Code Online (Sandbox Code Playgroud)

您遇到错误,因为正确的语法是

for key in word_dict: 
Run Code Online (Sandbox Code Playgroud)

只是键入循环word_dict.在这种情况下,你想要

for key,value in word_dict.iteritems(): 
Run Code Online (Sandbox Code Playgroud)

代替.