2010-02-18 182 views
13

我想能夠使用字符串作爲鍵和字符串作爲值來創建Python字典。例如:{ "crackers" : ["crunchy", "salty"] }它必須是一個集合,而不是一個列表。將字符串映射到一組字符串的Python字典?

但是,當我嘗試以下方法:

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用戶(我這樣想着,直到我遇到了這個問題。)

回答

27

set.add()不返回新set,它修改set它被稱爲上。使用這種方式:

word_dict = dict() 
word_dict["foo"] = set() 
word_dict["foo"].add("baz")          
word_dict["foo"].add("bang") 

此外,如果您使用的是for循環遍歷一個字典,你遍歷鍵:

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 
+0

謝謝。當然,呃。 – 2010-02-18 02:36:17

23
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) 
+0

+1並沒有直接回答這個問題,但肯定可以使OP的生活更容易在這裏。 – 2010-02-18 02:25:18

+0

不錯!好主意啊。 – 2010-02-18 02:36:56

+0

+1不知道..我有同樣的問題作爲OP,這是非常好的和國際海事組織比接受的答案更可讀。 – DrColossos 2011-10-03 10:46:42

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 
+0

或者,對於key_dict.iteritems()中的key,value值會稍長一些,但對於key和value的訪問會更好。 – 2010-02-18 02:26:43

6

當你說word_dict["foo"].add("baz"),要添加 '巴茲' 設定的word_dict [ 「富」]。

函數返回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(): 

改爲。

1

問題是這樣的:

word_dict["foo"] = word_dict["foo"].add("baz") 

當你調用word_dict["foo"].add("baz"),你的變異組word_dict["foo"]指,和操作返回None。因此,從右向左讀取您的陳述,您將「baz」添加到word_dict["foo"]所提及的集合中,然後將該操作的結果(即None)設置爲word_dict["foo"]

因此,要按照您的預期進行此項工作,只需從您的陳述中刪除word_dict["foo"] =即可。

字典遍歷在默認情況下他們的密鑰,因此ValueError異常你試試這個:

for key, value in word_dict: 

這裏發生的事情是,迭代上word_dict只返回一個鍵(比如,「富」),你」然後嘗試解壓縮變量key & value。開箱「foo」會給你「f」,「o」,&「o」,這是一個值太多而不適合兩個變量,因此你的ValueError。

正如其他人所指出的,你想要的是迭代的字典的鍵值對,就像這樣:

for key, value in word_dict.iteritems(): 
相關問題