2013-06-22 68 views
3

我有一個元組列表,如下圖所示:我可以在列表(或字典)理解中分組/聚合元素嗎?

[ 
    (1, "red") 
    (1, "red,green") 
    (1, "green,blue") 
    (2, "green") 
    (2, "yellow,blue") 
] 

我試圖捲起的數據,這樣我可以得到以下字典輸出:

{ 
    1: ["red", "green", "blue"] 
    2: ["green", "yellow", "blue"] 
} 

注意事項有:主鍵(數字)組合了一串顏色,然後分成一個列表,然後重新設置(例如使用set)。

我也想這樣做倒數,以及GROUP BY顏色:

{ 
    "red": [1], 
    "green": [1, 2] 
    "yellow": [2] 
    "blue": [1, 2] 
} 

我可以明確地通過所有元組的循環做到這一點,但我想嘗試做如果可能的話,列表/詞典解釋。

回答

3

您可以使用collections.defaultdict

>>> from collections import defaultdict 
>>> lis = [        
    (1, "red"), 
    (1, "red,green"), 
    (1, "green,blue"), 
    (2, "green"), 
    (2, "yellow,blue"), 
] 
>>> dic = defaultdict(set)  #sets only contain unique items 
for k, v in lis: 
    dic[k].update(v.split(',')) 

>>> dic 
defaultdict(<type 'set'>, 
{1: set(['blue', 'green', 'red']), 
2: set(['blue', 'green', 'yellow'])}) 

現在遍歷dic

>>> dic2 = defaultdict(list) 
for k,v in dic.iteritems(): 
    for val in v: 
     dic2[val].append(k) 
...   
>>> dic2 
defaultdict(<type 'list'>, 
{'blue': [1, 2], 
'green': [1, 2], 
'yellow': [2], 
'red': [1]}) 
+0

大 - 謝謝你 - 完美的作品。 –

-1

一號線的解決方案,以生成獨特元素的數量,使用字典內涵:

X = [1,2,1,3,1,4,1,5,2,3,2,4,2,5,3,4,3,5,4,5,5]

Xagg = {xx: sum([int(y==xx) for y in X]) for xx in set(X)}

Xagg

+1

歡迎來到SO!嘗試提供更多解釋給你的答案。請參閱[如何回答頁面](http://stackoverflow.com/help/how-to-answer)以獲取幫助改進答案。 – Madness

相關問題