简单的问题:我有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))]
但是这太丑陋了,我讨厌每次都这样做。有没有更好的办法?
zip是一种pythonic解决方案。
list(zip(u[::2], u[1::2]))
对于不支持切片表示法的迭代,这是一个更通用的解决方案
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]):
...