【发布时间】:2011-01-28 12:32:56
【问题描述】:
给定一个列表
A = [1 2 3 4 5 6]
是否有任何惯用(Pythonic)的方式来迭代它,就好像它是
B = [(1, 2) (3, 4) (5, 6)]
除了索引?这感觉像是来自 C 的保留:
for a1,a2 in [ (A[i], A[i+1]) for i in range(0, len(A), 2) ]:
我不禁觉得应该有一些使用 itertools 或切片或其他东西的巧妙 hack。
(当然,一次两个只是一个例子;我想要一个适用于任何 n 的解决方案。)
编辑:相关 Iterate over a string 2 (or n) characters at a time in Python 但即使是最干净的解决方案(已接受,使用 zip)也不能很好地推广到更高的 n 没有列表理解和 *-notation。
【问题讨论】:
-
我认为您的 C 保留看起来并不那么糟糕,但我会写
A[i:i+1]而不是A[i], A[i+1]。更容易扩展到任意n。 -
referenced accepted answer 实际上有一个干净的、无复制的解决方案,并且不需要列表理解或 * 表示法。最后,您需要在某处循环数据,因此任何循环/理解/生成器都不会付出额外的代价。如果您希望它更紧凑,请将引用的基于 itertools.islice 的解决方案封装到一个函数中。