遍历Python列表中的项目对[重复]

Posted

技术标签:

【中文标题】遍历Python列表中的项目对[重复]【英文标题】:Iterate through pairs of items in a Python list [duplicate] 【发布时间】:2011-08-11 12:13:16 【问题描述】:

可能的重复:Iterate a list as pair (current, next) in PythonIterating over every two elements in a list

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

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

它应该产生

[5, 7]
[7, 11]
[11, 4]
[4, 5]

【问题讨论】:

【参考方案1】:

来自Iterate over pairs in a list (circular fashion) in Python的几乎一字不差:

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

【讨论】:

空列表将在i.next() 引发StopIteration 现在在 Py2.x 和 3.x 中测试了这个作品。【参考方案2】:

来自itertools recipes:

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):
    ...

【讨论】:

@joaquin:不同之处在于它适用于迭代器,而不仅仅是序列。这里不需要,但你几乎不能称之为矫枉过正。我只是更喜欢迭代器,因为我一直在使用它们。 对于任何对循环对感兴趣的人,例如列表a,只需:pairwise(a +[a[0] ] ) 请注意那些发现这一点的人,这适用于迭代器的优点是这不需要随机访问数据流(即数组访问);相反,它只需要摄取每个项目一次,并将其缓存以供下一次评估。因此,如果你有一个 Twitter 消防软管,你就不需要将消防软管读入一个巨大的(也许是无限长的)数组中。 如果可迭代基数是奇数 VS zip,此解决方案不会删除最后一个元素。 在 Python 3 中,您将获得 ImportError: cannot import name 'izip' from 'itertools' (unknown location)。您可以在 Python 3 的 itertools 中使用 zip 而不是 izip【参考方案3】:

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

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

【讨论】:

按索引引用列表项是 Python 中的一种反模式(除非项必须按顺序访问)。见github.com/JeffPaine/…【参考方案4】:
>>> 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

【讨论】:

如果你不打算使用k,为什么要enumerate 我猜是因为我们需要索引。 @Tanin 那么for n i range(len(a)): 不是更准确和惯用吗? 是的,range(len(a) - 1) 更好。【参考方案5】:

您可以zip 列表本身没有第一个元素:

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

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

即使您的列表没有元素或只有 1 个元素,这仍然有效(在这种情况下,zip 返回一个空的可迭代对象并且for 循环中的代码永远不会执行)。它不适用于generators,仅适用于sequences(tupleliststr 等)。

【讨论】:

这不起作用。您正在迭代的每个单独列表都不足以“跳过”下一条记录,因此您的示例给出的输出如下:[5, 7] [7, 11] [11, 4] [4, 5] 但这正是我们想要的结果,不是吗? 嗯......是的 - 我认为 OP 正在寻找它 - 虽然我看到“成对”迭代返回像 [5,7]、[11,4]、[5,None] @Brad 对于这种情况,zip(a[::2], a[1::2]),它将在每个列表中步进 2。

以上是关于遍历Python列表中的项目对[重复]的主要内容,如果未能解决你的问题,请参考以下文章

迭代Python列表中的每两个元素[重复]

python --遍历

python列表的遍历与循环

将项目附加到列表列表中的指定列表(Python)[重复]

如何根据列表中的项目复制熊猫中的行[重复]

python ---迭代器与生成器