I would like to be able to make a Python dictionary with strings as keys and sets of strings as the values. E.g.: { "crackers" : ["crunchy", "salty"] } It must be a set, not a list.
However, when I try the following:
word_dict = dict()
word_dict["foo"] = set()
word_dict["foo"] = word_dict["foo"].add("baz")
word_dict["foo"] = word_dict["foo"].add("bang")
I get:
Traceback (most recent call last):
File "process_input.py", line 56, in
test()
File "process_input.py", line 51, in test
word_dict["foo"] = word_dict["foo"].add("bang")
AttributeError: 'NoneType' object has no attribute 'add'
If I do this:
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
I get:
Traceback (most recent call last):
File "process_input.py", line 61, in
test()
File "process_input.py", line 58, in test
for key, value in word_dict:
ValueError: too many values to unpack
Any tips on how to coerce Python into doing what I'd like? I'm an intermediate Python user (or so I thought, until I ran into this problem.)
解决方案
set.add() does not return a new set, it modifies the set it is called on. Use it this way:
word_dict = dict()
word_dict["foo"] = set()
word_dict["foo"].add("baz")
word_dict["foo"].add("bang")
Also, if you use a for loop to iterate over a dict, you are iterating over the keys:
for key in word_dict:
print key, word_dict[key]
Alternatively you could iterate over word_dict.items() or word_dict.iteritems():
for key, value in word_dict.items():
print key, value