如何配对列表中的连续元素,没有重叠?

时间:2018-01-23 23:46:32

标签: python python-3.x list

简单问题:我有u = [1, 2, 3, 4, 5, 6]。我想要v = [(1,2), (3,4), (5,6)]。怎么样?

显然,一个解决方案是:

v = []
for i in range(len(u)):
    j = 2*i
    v += [(u(j), u(j+1))]

但这太丑陋了我讨厌每次都这样做。还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

zip是一种pythonic解决方案。

list(zip(u[::2], u[1::2]))

答案 1 :(得分:0)

这是针对不支持切片符号的迭代的更通用的解决方案

def n_clusters(iterable, n=2):
    return zip(*[iter(iterable)]*n)

请注意,输出中不包含任何剩余值(例如输入列表中包含奇数个元素)。我们通过使用itertools.zip_longest函数来纠正这个问题。

from itertools import zip_longest

def n_clusters(iterable, n=2, fillvalue=None):
    return zip_longest(*[iter(iterable)]*n, fillvalue=fillvalue)

以上两者都将在分组值上返回迭代器。您可以手动构建一个列表

grouped_values = list(n_cluster([1, 2, 3, 4]))
# [(1, 2), (3, 4)]

或直接迭代它们

for a, b in n_cluster([1, 2, 3, 4]):
    ...