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

3 投票
5 回答
1466 浏览
提问于 2025-04-15 16:44

我想用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 个回答

1

这可能不是最符合Python风格的答案,但这个方法是有效的:

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()
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)所做的事情。

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] 则是从每一组中提取出每个元素的第一个项目。

撰写回答