将字符串映射到字符串集合的Python字典?

18 投票
5 回答
72529 浏览
提问于 2025-04-15 19:25

我想创建一个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

撰写回答