2009-08-05 94 views
30

我正在尋找一種方法來轉換的元組它看起來像這樣的名單:PYTHON:轉換的元組列表轉換成字典

[(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 

字典,其中key:value對容貌像這樣:

{4:[1,2,3] ,15:[4,5,9,11,12], 23:[6,7,8,10]} 

元組中的第二個元素變成字典鍵。 第一個元組被分配給該鍵。

你能告訴我該怎麼做嗎?

+1

爲什麼你想要一個字典的列表,其中每個字典只有一個鍵/值?你確定你不只是想要一本字典嗎? – FogleBird 2009-08-05 14:26:35

+0

是的,你是對的FogleBird。我最終正在尋找字典。感謝您指出這一點...... – elfuego1 2009-08-06 00:57:23

+21

從大量的意見來看,大多數人(像我一樣)在這裏尋找如何轉換myList = [(key1,val1),(key2,val2),...] '字典:'{key1:val1,key2:val2 ...}'。 爲此,只需做'dict(myList)' – mindthief 2011-03-02 05:38:36

回答

43
>>> from collections import defaultdict 
>>> l= [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
>>> d= defaultdict(list) 
>>> for v, k in l: 
...  d[k].append(v) 
... 
>>> d 
defaultdict(<type 'list'>, {23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]}) 
>>> [ {k:d[k]} for k in sorted(d) ] 
[{4: [1, 2, 3]}, {15: [4, 5, 9, 11, 12]}, {23: [6, 7, 8, 10]}] 
+0

使用defaultdict +1。比每次調用setdefault()更平滑。 – 2009-08-05 15:29:48

+0

Love collections.defaultdict。這是我去上課很多工作。 – hughdbrown 2009-08-05 16:23:55

2
l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
d = {} 
for v, k in l: 
    d.setdefault(k, []).append(v) 
+0

通過在您的編輯中複製我對setdefault的使用,現在選民可以選擇的選項更少... – FogleBird 2009-08-05 14:28:00

+2

我真的沒有複製它。我意識到我可以使用setdefault,並在發佈後更新,因爲我更喜歡它。 – c089 2009-08-05 14:35:36

+0

沒問題。無論如何編輯添加其他想法並不錯,但通常會添加更多信息,而不是創建重複答案。但我知道你沒有複製我的。 – FogleBird 2009-08-05 14:37:42

2
tuples = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
dicts = {} 
for elem in tuples: 
    try: 
     dicts[elem[1]].append(elem[0]) 
    except KeyError: 
     dicts[elem[1]] = [elem[0],] 
+1

在for循環中使用解包。並且不需要在一個項目列表中(只有元組)的逗號。在這裏使用異常比Python更好,但在這種情況下仍然有點愚蠢。 – FogleBird 2009-08-05 14:25:10

+2

這個例外不是愚蠢的 - 它是如何執行defaultdict的。我同意拆箱。 – xorsyst 2011-09-20 14:44:25

12
>>> a = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
>>> b = {} 
>>> for i, j in a: 
...  b.setdefault(j, []).append(i) 
... 
>>> b 
{23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]} 
>>> 
+0

非常感謝! – elfuego1 2009-08-05 14:33:36

+0

太棒了!我今天剛剛學會了一個新的字典操作 - setdefault。這將整理我的代碼!乾杯。 +1 – 2009-08-05 15:02:44

+3

@Steve Folly:看看collections.defaultdict。它甚至更好。 – 2009-08-05 15:23:10

2

這樣做:

from collections import defaultdict 

def to_list_of_dicts(list_of_tuples): 
    d = defaultdict(list) 
    for x, y in list_of_tuples: 
     d[y].append(x) 
    return sorted([{x: y} for (x, y) in d.items()]) 
2

這不是幻想,但它是簡單

l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
d = dict((k, [i[0] for i in l if i[1] == k]) for k in frozenset(j[1] for j in l)) 

好哇!