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