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

将字符串映射到一组字符串的Python字典?,python,dictionary,set,Python,Dictionary,Set,我希望能够制作一个Python字典,其中字符串作为键,字符串集作为值。例如:{“饼干”:[“脆”、“咸”]}它必须是一个集合,而不是列表 但是,当我尝试以下操作时: word_dict = dict() word_dict["foo"] = set() word_dict["foo"] = word_dict["foo"].add("baz") word_dict["foo"] = word_dict["fo

我希望能够制作一个Python字典,其中字符串作为键,字符串集作为值。例如:
{“饼干”:[“脆”、“咸”]}
它必须是一个集合,而不是列表

但是,当我尝试以下操作时:

  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'
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
我得到:

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'
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
回溯(最近一次呼叫最后一次):
文件“process_input.py”,第61行,在
测试()
测试中第58行的文件“process_input.py”
对于关键字,word_dict中的值:
ValueError:要解压缩的值太多
关于如何强迫Python做我想做的事情,有什么建议吗?我是一个中级Python用户(或者我一直这么认为,直到遇到这个问题。)

set.add()
不会返回新的
集,它会修改调用它的
集。这样使用它:

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\u dict.items()
word\u dict.iteritems()

尝试:

看起来标准字典迭代器只返回
,而不返回元组

证明:

>>> 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
>d={'test':1}
>>>对于d中的k,v:打印k,v
... 
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:要解压缩的值太多
>>>对于d中的k:打印d[k]
... 
1.

当你说
word_dict[“foo”]。add(“baz”)
时,你是在将“baz”添加到设置的单词_dict[“foo”]

函数返回
None
——更新集合会产生副作用。所以

word_dict["foo"] = word_dict["foo"].add("baz") 
最终将
word\u dict[“foo”]
设置为
None

只需
word_dict[“foo”]。添加(“baz”)
即可

在第二种情况下,当你说

for key, value in word_dict:                                                       
您遇到了一个错误,因为正确的语法是

for key in word_dict: 
只在
word\u dict
中的键上循环。在这种情况下,你想要

for key,value in word_dict.iteritems(): 
相反。

问题在于:

word_dict["foo"] = word_dict["foo"].add("baz")   
当您调用
word_dict[“foo”].add(“baz”)
时,您正在对
word_dict[“foo”]
引用的集合进行变异,该操作返回
None
。因此,从右到左阅读您的语句,您将“baz”添加到由
word_dict[“foo”]
引用的集合中,然后将该操作的结果(即,
None
)设置为
word_dict[“foo”]

因此,要使这项工作如您所期望的那样有效,只需从您的语句中删除
word_dict[“foo”]=

默认情况下,字典会在其键上迭代,因此ValueError您可以尝试以下操作:

for key, value in word_dict: 
这里发生的事情是,在word_dict上迭代只返回一个键(比如“foo”),然后您试图将其解压到变量
key
&
value
。解包“foo”会得到“f”、“o”和“o”,这是一个太多的值,无法放入两个变量中,因此会产生ValueError

正如其他人所说,您希望迭代字典的键值对,如下所示:

for key, value in word_dict.iteritems (): 

+1不能直接回答问题,但肯定能让OP的生活更轻松。+1不知道。。我遇到了与OP相同的问题,这非常好,而且我比公认的答案更具可读性。Python 3将:
dict.iteritems()
重命名为:
dict.items()
或者,
对于关键字,word中的值。
稍微长一点,但是对于
key
value
IMHO的访问更好。
for key, value in word_dict: 
for key, value in word_dict.iteritems ():