将字符串映射到字符串集合的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用户,但遇到这个问题后,我开始怀疑自己了。
5 个回答
7
当你写 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")
就可以了,这样是对的。
在第二种情况下,当你写
for key, value in word_dict:
时会出现错误,因为正确的写法是
for key in word_dict:
只遍历 word_dict
中的键。在这种情况下,你想要的是
for key,value in word_dict.iteritems():
而不是其他的。
31
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)
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
32
set.add()
这个方法并不会返回一个新的 set
,而是直接修改你调用它的那个 set
。你可以这样使用它:
word_dict = dict()
word_dict["foo"] = set()
word_dict["foo"].add("baz")
word_dict["foo"].add("bang")
另外,如果你用 for
循环来遍历一个字典(dict),你其实是在遍历它的键(keys):
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