迭代Python列表中的项目对

mrv*_*rvn 85 python loops list

可能的重复:
在Python中迭代列表(当前,下一个)
迭代列表中的每两个元素

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

a = [5, 7, 11, 4, 5]
for v, w in a:
    print [v, w]
Run Code Online (Sandbox Code Playgroud)

它应该产生

[5, 7]
[7, 11]
[11, 4]
[4, 5]
Run Code Online (Sandbox Code Playgroud)

hlu*_*luk 116

你可以使用这个zip功能:

a = [5, 7, 11, 4, 5]
for v, w in zip(a[:-1], a[1:]):
    print [v, w]
Run Code Online (Sandbox Code Playgroud)

  • 你不需要`a [: - 1]`,因为`zip(..)`会截断它:只需`zip(a,a [1:])`就行了. (27认同)
  • @Brad对于这种情况,`zip(a [:: 2],a [1 :: 2])`,它将逐步通过每个列表. (16认同)
  • 但这正是我们想要的结果,不是吗? (8认同)
  • 嗯...是的 - 我认为OP正在寻找它 - 尽管我看到“成对”迭代返回像[5,7],[11,4],[5,None] (6认同)
  • @EvgeniSergeev虽然你是对的,我可能会把[:-1]放在那里,让读者清楚我在做什么,而不是依靠隐式截断来表达意义 (5认同)
  • 这是行不通的。您正在迭代的每个单独列表都不足以“跳过”下一条记录,因此您的示例给出的输出如下:[5, 7] [7, 11] [11, 4] [4, 5] (4认同)

Joc*_*zel 85

来自itertools receipes:

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

for v, w in pairwise(a):
    ...
Run Code Online (Sandbox Code Playgroud)

  • 在Python 3.10中,您可以使用“itertools.pairwise”:https://docs.python.org/3/library/itertools.html#itertools.pairwise (9认同)
  • 对那些发现这一点的人来说,这对迭代器起作用的好处是,这不需要随机访问数据流(即数组访问); 相反,它只需要一次摄取每个项目,并将其缓存以用于下一次评估.所以,如果你有一个Twitter消防队员,你就不需要将这个消防队列成一个巨大的(也许是无限长的)阵列来实现这个目的. (6认同)
  • @joaquin:区别在于它适用于迭代器,而不仅仅是序列.这里不需要,但你几乎不能称之为矫枉过正.我只是喜欢迭代器,因为我一直在使用它们. (3认同)
  • 对于任何对例如列表"a"的循环对感兴趣的人,只需执行:`pairwise(a + [a [0]])`. (3认同)

San*_*dri 59

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

a =  [5, 7, 11, 4, 5]
for i in range(len(a)-1):
    print [a[i], a[i+1]]
Run Code Online (Sandbox Code Playgroud)

  • 通过索引引用列表项是 Python 中的一种反模式(除非必须不按顺序访问项)。请参阅 https://github.com/JeffPaine/beautiful_idiomatic_python#looping-over-a-collection (3认同)

Gab*_*abe 13

几乎逐字逐句迭代Python中的列表(循环方式)中的对:

def pairs(seq):
    i = iter(seq)
    prev = next(i)
    for item in i:
        yield prev, item
        prev = item
Run Code Online (Sandbox Code Playgroud)

  • 一个空列表将在`i.next()`处引发`StopIteration`. (4认同)

Rom*_*est 11

另一种方法是itertools.pairwise(Python 3.10 或更高版本):

from itertools import pairwise

temp = [-39.5, -27.5, -15.5, -3.5, 8.5, 20.5, 32.5, 44.5, 56.5, 68.5, 80.5, 92.5,104.5]
res = list(pairwise(temp))
Run Code Online (Sandbox Code Playgroud)
[(-39.5, -27.5), (-27.5, -15.5), (-15.5, -3.5), (-3.5, 8.5), (8.5, 20.5), (20.5, 32.5), (32.5, 44.5), (44.5, 56.5), (56.5, 68.5), (68.5, 80.5), (80.5, 92.5), (92.5, 104.5)]
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 6

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • @Tanin然后不会`为ni范围(len(a)):`更准确和惯用? (5认同)
  • 如果你不打算使用`k`,为什么要枚举? (4认同)
  • 是的, range(len(a) - 1) 更好。 (2认同)