2013-04-01 121 views
21

我有一個Python字典分組Python字典鍵作爲一個列表,並創建這個列表中的新詞典作爲值

d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1} 

由於在上述字典中的值不是唯一的。我想作爲組列表中唯一值的所有鍵並創建一個新的字典如下:

v = {6:[1], 1:[2, 3, 6], 9: [4, 5]} 

v應該被排序新詞典的按鍵。我發現很難想象和實現這個字典的創建。請建議我一個簡單而有效的方法來做到這一點。

回答

32

使用collections.defaultdict便於:

from collections import defaultdict 

v = defaultdict(list) 

for key, value in sorted(d.iteritems()): 
    v[value].append(key) 

,但你可以用一個沼澤標準dict也做到這一點:

v = {} 

for key, value in sorted(d.iteritems()): 
    v.setdefault(value, []).append(key) 

在Python 3,使用sorted(d.items())代替。

+1

如果你去與defaultdict,但不想「默認」行爲在初始化字典後繼續,可以將'default_factory'屬性設置爲'None'。那麼你的'defaultdict'幾乎在任何方面都會像一個普通的字典。 – mgilson

+0

作爲一個側面說明,我是你對物品進行分類的巨大粉絲,而不是像大多數人(或者至少是我的)第一本能那樣的價值觀。 +1。 – mgilson

+0

第二行中的「list」是什麼?它似乎只會有'v = defaultdict()' – clwen

10

如果不實際上是在一天結束的時候需要一個dict,你可以使用itertools.groupby

from itertools import groupby 
from operator import itemgetter 

for k,v in groupby(sorted(d.items()),key=itemgetter(0)): 
    print k,list(v) 

當然,你可以使用它來構建一個字典,如果你真的想:

{k:list(v) for k,v in groupby(sorted(d.items()),key=itemgetter(0))} 

但是在那個時候,你可能會更好地使用Martijn的defaultdict解決方案。

+0

您的字典不起作用,而是產生:'{1:[(1,6)],2:[(2,1)],3:[(3,1)],4:[(4, 9)],5:[(5,9)],6:[(6,1)]}' – xApple

-1

建設排序值,並在新的字典在現有的鍵值添加,否則循環創建一個新的關鍵:

result = {} 
d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1} 

for i, j in sorted(d.items(), key=lambda x: x[1]): 
    if j not in result: 
     result.update({j: [i]}) 
    else: 
     result.update({j: result[j] + [i]}) 
+4

請解釋你的答案。 – Blackbam

+1

請提供更多詳情。謝謝 – Robert

+0

@Blackbam更新了答案 – Frank

相關問題