2009-12-06 116 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的最后一个列表中。

相关问题