2014-10-11 52 views
-4

dictonary值,所以說,我有我的字典Python 3的轉換爲一組

In [80]: dict_of_lists 
Out[80]: 
{'Marxes': ['Groucho', 'Chico', 'Harpo'], 
'Pythons': ['Chapman', 'Cleese', 'Gilliam'], 
'Stooges': ['Larry', 'Curly', 'Moe']} 

,我意識到,以後我會想對待值集。如何將字典從值(列表)轉換爲值(集)結構?

這是whati試過。

In [84]: new_dict = [set(dict_of_lists.values()) for values in dict_of_lists.keys()] 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-84-f49792cd81ac> in <module>() 
----> 1 new_dict = [set(dict_of_lists.values()) for values in dict_of_lists.keys()] 

<ipython-input-84-f49792cd81ac> in <listcomp>(.0) 
----> 1 new_dict = [set(dict_of_lists.values()) for values in dict_of_lists.keys()] 

TypeError: unhashable type: 'list' 

和這個相當醜陋的努力。

In [83]: for list(dict_of_lists.keys()) in dict_of_lists: 
    ....:  set list(dict 
dict   dict_of_lists 
    ....:  set(list(dict_of_lists.values())) 
    ....:  
    File "<ipython-input-83-08e0645abb2f>", line 1 
    for list(dict_of_lists.keys()) in dict_of_lists: 
    ^
SyntaxError: can't assign to function call 
+0

請出示你想看到的結果 – 2014-10-11 11:33:59

+0

您實際上是創建值列表什麼樣的一套作爲集合,而不是字典。這是你想要的嗎? – 2014-10-11 11:36:21

回答

3

所有你需要的是:

for k, v in d.items(): 
    d[k] = set(v) 

解釋爲何你的企圖沒有工作:

new_dict = [set(dict_of_lists.values()) for values in dict_of_lists.keys()] 

在這一行,你是:

  • 迭代字典的鍵(好的開始,雖然你不需要指定.keys(),因爲這是字典迭代的默認值);
  • 爲名稱values指定每個鍵(混淆,如果不一定是終端);
  • 然後,對於字典中的每個鍵,試圖將所有字典的值(這是一個列表列表)轉換爲一個集合,這是你不能做的(列表是可變的,不可哈希的,所以不能是字典鍵或集合元素);最後
  • 試圖從結果中列出一個列表,而不是一本字典。

然後:

for list(dict_of_lists.keys()) in dict_of_lists: 

現在你遍歷隱含的鑰匙,這是很好的,但後來想每個鍵呼叫的結果分配給list,用顯式調用再次到keys;有效地,這條線是:

['Marxes', 'Pythons', 'Stooges'] = 'Marxes' 

這沒有任何意義。

1

使用字典理解:

>>> x 
{'Pythons': ['Chapman', 'Cleese', 'Gilliam'], 'Marxes': ['Groucho', 'Chico', 'Harpo'], 'Stooges': ['Larry', 'Curly', 'Moe']} 
>>> y = {k:set(v) for k,v in x.items()} 
>>> y 
{'Pythons': {'Gilliam', 'Chapman', 'Cleese'}, 'Marxes': {'Groucho', 'Chico', 'Harpo'}, 'Stooges': {'Curly', 'Moe', 'Larry'}} 
1
dict_of_sets = {k:set(v) for k,v in dict_of_lists.items()} 

這給:

{'Stooges': {'Curly', 'Larry', 'Moe'}, 'Pythons': {'Cleese', 'Chapman', 'Gilliam'}, 'Marxes': {'Groucho', 'Chico', 'Harpo'}}