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

时间:2010-02-18 02:20:45

标签: 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")

我明白了:

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 个答案:

答案 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