我希望能够创建一个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用户(或者我想,直到我遇到这个问题。)
答案 0 :(得分:28)
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
答案 1 :(得分: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)
答案 2 :(得分:6)
当您说word_dict["foo"].add("baz")
时,您将'baz'添加到设置word_dict [“foo”]。
该函数返回None
- 更新集合是副作用。所以
word_dict["foo"] = word_dict["foo"].add("baz")
最终将word_dict["foo"]
设置为None
。
只需word_dict["foo"].add("baz")
即可。
在第二种情况下,当你说
时for key, value in word_dict:
您遇到错误,因为正确的语法是
for key in word_dict:
仅循环word_dict
中的键。在这种情况下,你想要
for key,value in word_dict.iteritems():
代替。
答案 3 :(得分:1)
尝试:
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
答案 4 :(得分:1)
问题在于:
word_dict["foo"] = word_dict["foo"].add("baz")
当您致电word_dict["foo"].add("baz")
时,您正在改变word_dict["foo"]
引用的集合,并且该操作返回None
。因此,从右到左阅读您的陈述,您将“baz”添加到word_dict["foo"]
所引用的集合中,然后将该操作的结果(即None
)设置为{{1} }。
因此,要使其按预期工作,只需从语句中删除word_dict["foo"]
。
默认情况下,字典会对其键进行迭代,因此您尝试使用ValueError:
word_dict["foo"] =
这里发生的事情是迭代word_dict只返回一个键(比如“foo”),然后你试图将其解包到变量for key, value in word_dict:
&amp; key
。打开“foo”包给你“f”,“o”,&amp; “o”,这是一个值太多而无法容纳两个变量的值,因此也就是你的ValueError。
正如其他人所说,你想要的是迭代字典的键值对,如下所示:
value