迭代 Python 列表中的项对

是否可以在 Python 中以下面的方式迭代列表(将此代码视为伪代码) ?

a = [5, 7, 11, 4, 5]
for v, w in a:
print [v, w]

它应该生产

[5, 7]
[7, 11]
[11, 4]
[4, 5]
153777 次浏览

几乎一字不差地来自 在 Python 中以列表(循环方式)迭代对:

def pairs(seq):
i = iter(seq)
prev = next(i)
for item in i:
yield prev, item
prev = item

来自 itertools食谱:

from itertools import tee


def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)


for v, w in pairwise(a):
...

要做到这一点,你应该这样做:

a =  [5, 7, 11, 4, 5]
for i in range(len(a)-1):
print [a[i], a[i+1]]
>>> a = [5, 7, 11, 4, 5]
>>> for n,k in enumerate(a[:-1]):
...     print a[n],a[n+1]
...
5 7
7 11
11 4
4 5

可以使用 zip列表本身不包含第一个元素:

a = [5, 7, 11, 4, 5]


for previous, current in zip(a, a[1:]):
print(previous, current)

即使列表中没有元素或只有1个元素(在这种情况下,zip返回一个空的迭代器,而且 for循环中的代码永远不会执行) ,这种方法也可以工作。它不工作的 发电机,只有 序列(tupleliststr等)。