使用Python将元组列表转换为嵌套列表

时间:2009-12-06 14:04:33

标签: python list nested tuples

我想使用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方式的见解吗?

5 个答案:

答案 0 :(得分: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个连续元素的组,其中所有元素都具有相同的第1个(从零开始计数)项。 [x for x, y in group]保留每个组中每个元素的第0项。

答案 1 :(得分: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)所做的。

答案 2 :(得分: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()

答案 3 :(得分: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存储元组的当前第二部分。如果更改,请在n_list中为此新的第二个值开始一个新列表,从fst开始,否则将fst添加到n_list中的最后一个列表。

答案 4 :(得分: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]]