合并子列表

时间:2015-07-18 16:06:06

标签: python list merge

我有这个清单:

newlis = [[6], [3], [4], [10], [9], [1], [2], [5], [7], [0], [8]]

我想合并每两个连续的子列表(无论它们是奇数还是偶数)。我试过这段代码:

    while len(newlis) != 1:
        lis1=[(a + b) for a, b in zip(newlis[::2], newlis[1::2])]
        newlis=lis1
        print newlis

结果是:[[6, 3], [4, 10], [9, 1], [2, 5], [7, 0]]

如何修改将打印[[6, 3], [4, 10], [9, 1], [2, 5], [7, 0], [8]]的代码?

3 个答案:

答案 0 :(得分:1)

您可以在{3}中使用itertools.izip_longestitertools.zip_longest):

>>> from itertools import izip_longest
>>> [(a + b) if b else a for a, b in izip_longest(newlis[::2], newlis[1::2])]
[[6, 3], [4, 10], [9, 1], [2, 5], [7, 0], [8]]

此功能还接受fillvalue,您可以使用>>> [(a + b) for a, b in izip_longest(newlis[::2], newlis[1::2],fillvalue=['**'])] [[6, 3], [4, 10], [9, 1], [2, 5], [7, 0], [8, '**']] 来填充服装价值的错过值:

chain

另一个选择是使用islice>>> from itertools import islice,chain >>> [list(chain.from_iterable(islice(newlis,i,i+2))) for i in range(0,len(newlis),2)] [[6, 3], [4, 10], [9, 1], [2, 5], [7, 0], [8]]

<div id="tasks"><%= @like %></div>

答案 1 :(得分:0)

使用itertools.groupby

>>> [[w for _, q in k for w in q] for _, k in itertools.groupby(enumerate(newlis), lambda (a,b):a//2)]
[[6, 3], [4, 10], [9, 1], [2, 5], [7, 0], [8]]

答案 2 :(得分:0)

如果您不想导入任何库,可以使用这个简单的一行:

result = [sum(newlis[i:i+2], []) for i in range(0, len(newlis), 2)]