使用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做这个的“正确”方法是什么?
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]
则是从每一组中提取出每个元素的第一个项目。