【问题标题】:Iterate through pairs of items in a Python list [duplicate]遍历Python列表中的项目对[重复]
【发布时间】:2020-01-07 19:34:51
【问题描述】:

可能的重复:
Iterate a list as pair (current, next) in Python
Iterating 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]

【问题讨论】:

    标签: python list loops


    【解决方案1】:

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

    a = [5, 7, 11, 4, 5]
    
    for previous, current in zip(a, a[1:]):
        print(previous, current)
    

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

    【讨论】:

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

    来自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 中测试了这个作品。
    【解决方案5】:
    >>> 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) 更好。
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多