2009-12-06 131 views
3

我想使用Python將元組列表轉換爲嵌套列表。我怎麼做?使用Python將元組列表轉換爲嵌套列表

我有一個元組的排序列表(由第二值排序):

[(1, 5), (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), (12, 1), 
(10, 1), (9, 1), (8, 1), (7, 1), (6, 1), (2, 1)] 

現在我希望它有一個像這樣(在列表中忽略,嵌套的第二個值):

[ [1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2] ] 

我已經在這裏看到其他線程map用於這樣的事情,但我不完全理解它。任何人都可以提供有關這種「正確」python方式的見解嗎?

回答

11
from operator import itemgetter 
from itertools import groupby 

lst = [(1, 5), (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), 
     (12, 1), (10, 1), (9, 1), (8, 1), (7, 1), (6, 1), (2, 1)] 

result = [[x for x, y in group] 
      for key, group in groupby(lst, key=itemgetter(1))] 

groupby(lst, key=itemgetter(1))產生,其中所有的元素都具有相同的lst連續元素組第一(從零開始計算)項目。 [x for x, y in group]保持每個組內每個元素的第0項。

+0

我喜歡這個。簡單而沒有映射。 – proxylittle 2009-12-06 14:59:29

+0

哦,忽略它。 nvm ..錯字。 – proxylittle 2009-12-06 15:09:18

+0

可能'sort'是一個整數列表,而不是一個2元組列表。 – 2009-12-06 15:10:00

0

不知道有多快,這將是更大的套,但你可以做這樣的事情:

input = [ 
    (1, 5), (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), 
    (12, 1), (10, 1), (9, 1), (8, 1), (7, 1), (6, 1), 
    (2, 1) 
] 

output = [[] for _ in xrange(input[0][1])] 
for value, key in input: 
    output[-key].append(value) 

print output # => [[1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2]] 
+0

您假定len(輸出)應該與最高鍵值相匹配,並且鍵值始終是連續的。 – ironfroggy 2009-12-06 14:21:28

+0

是的,我認爲OP希望'input'和'output'中的索引匹配 - 因此, '(3,2)'out of'input',然後'output [-2]'將是一個空列表。很難說只有一個數據集。 – 2009-12-06 14:35:24

2

這是一個有點令人費解,但你可以用itertools.groupby功能做到這一點:

>>> lst = [(1, 5), (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), (12, 1), 
(10, 1), (9, 1), (8, 1), (7, 1), (6, 1), (2, 1)] 
>>> from operator import itemgetter 
>>> import itertools 
>>> [map(itemgetter(0), group) for (key,group) in itertools.groupby(lst, itemgetter(1))] 
[[1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2]] 
>>> 

說明: GROUPBY返回一個迭代器爲一組,其中一組被定義爲條目的序列具有與作爲單獨參數傳遞的函數返回的值相同的值。 itemgetter(1)生成一個函數,它在用參數x調用時返回x [1]。 由於groupby迭代器返回兩個值 - 使用的鍵和原始值的元組序列,因此我們需要刪除每個元組中的第二個值,即map(itemgetter(0),group)的作用。

+0

不錯,但你的最後一行是混亂的,因爲我需要學習映射文件。我認爲它貼出了幾乎相同的roberto。但是,謝謝! – proxylittle 2009-12-06 15:01:00

1

也許不是最pythonesque答案,但這個工程:

d = {} 

a = [(1,5), (5,4), (13,3), (4,3), (3,2), (14,1), (12,1)] 

for value in a: 
    if value[0] not in d: 
     d[ value[0] ] = [] 
    d[ value[0] ].append(a[1]) 

print d.values() 
+0

我會改善這與setdefault(),而不是檢查'價值[0]不在D' – ironfroggy 2009-12-06 14:22:29

1

簡單的解決方案:

n_list = [] 
c_snd = None 
for (fst, snd) in o_list: 
    if snd == c_snd: n_list[-1].append(fst) 
    else: 
    c_snd = snd 
    n_list.append([fst]) 

說明:使用c_snd存儲元組的當前第二部分。如果發生變化,請從fst開始在n_list中爲此新的第二個值開始一個新列表,否則將fst添加到n_list的最後一個列表中。