【问题标题】:Is there an easy way to get next and prev values in a for-loop?有没有一种简单的方法可以在 for 循环中获取下一个和上一个值?
【发布时间】:2015-01-20 07:38:43
【问题描述】:

那么...在 Python 中使用 for 循环进行迭代时,是否有一种简单的方法可以获取下一个和上一个值?

我知道,如果您执行以下操作,这很容易做到:

a = [3,4,5,6,3,4,5]
for x in range(len(a)):
    next = a[x+1]

但是呢:

for x in a:
    x.next??

【问题讨论】:

  • 你能举个例子吗?如果x = 4,你的预期输出是什么?
  • 那么对于第二个代码 sn-p,假设 x 在索引 1 处命中 4,是否有返回 5 的内置函数?
  • @pyramidface:你的问题很抽象。您想对下一个和上一个值做什么?你如何获得它们可能取决于你想用它们做什么。
  • 有用的问题。 Java 实现了这样的流。 Python 没有。
  • 我故意让它保持开放式。我只是想知道 python 中是否有一个内置函数,您可以轻松地使用它来获取下一个值。一个用法示例是查看字符串中的下一个值是字母还是数字。

标签: python for-loop iteration


【解决方案1】:

可能有点矫枉过正,但我​​有时会为此使用以下更通用的生成器,它会在列表或其他可迭代对象中生成任意大小的“窗口”序列。 (窗口大小必须小于可迭代的长度。)

def sliding_window(iterable, size):
    try:                    # indexed iterable
        for i in range(len(iterable) - size + 1):
            yield iterable[i:i+size]
    except TypeError:       # iterator
        window = [next(iterable) for _ in range(size)]
        yield window
        for item in iterable:
            window = window[1:] + [item]
            yield window

a = [3,4,5,6,3,4,5]
for current, following in sliding_window(a, 2):
    print(current, following)

【讨论】:

    【解决方案2】:

    您始终可以将 a 转换为带有 iter 的迭代器,然后对其进行迭代。这将允许您在循环内使用 next 来推进您正在迭代的迭代器:

    >>> a = [3,4,5,6,3,4,5]
    >>> it = iter(a)
    >>> for i in it:
    ...     j = next(it, None)
    ...     print('i={}, j={}'.format(i, j))
    ...
    i=3, j=4
    i=5, j=6
    i=3, j=4
    i=5, j=None
    >>>
    

    此外,如果没有下一项,则其中的None 是默认值。您可以将其设置为您想要的任何值。省略参数将引发StopIteration 异常:

    >>> a = [1, 2, 3, 4, 5]
    >>> it = iter(a)
    >>> for i in it:
    ...     j = next(it)
    ...     print('i={}, j={}'.format(i, j))
    ...
    i=1, j=2
    i=3, j=4
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    StopIteration
    >>>
    

    【讨论】:

    • 我以前没见过这个。感谢分享。
    【解决方案3】:

    这也很简单:

    >>> a = [3,4,5,6,3,4,5]
    >>> for i in range(1,len(a)):
    ...     print a[i-1],a[i]
    ... 
    3 4
    4 5
    5 6
    6 3
    3 4
    4 5
    

    【讨论】:

      【解决方案4】:

      如果您希望 previousnext 元素在每次迭代的循环序列中:

      a = [3,4,5,6,3,4,5]
      l = len(a)
      
      for k, v in enumerate(a):
          print a[(k-1)%l], v, a[(k+1)%l] #prints previous, current, next elements
      

      【讨论】:

        【解决方案5】:

        这是我用来迭代序列中的成对项的常见模式:

        >>> a = range(10)
        >>> for i, j in zip(a, a[1:]):
        ...  print i, j
        ... 
        0 1
        1 2
        2 3
        3 4
        4 5
        5 6
        6 7
        7 8
        8 9
        

        如果你想要三个项目(上一个、项目、下一个),你可以这样做:

        >>> for i, j, k in zip(a, a[1:], a[2:]):
        ...  print i, j, k
        ... 
        0 1 2
        1 2 3
        2 3 4
        3 4 5
        4 5 6
        5 6 7
        6 7 8
        7 8 9
        

        i 是前一个元素,j 是当前元素,k 是下一个元素。

        当然,这个“开始”在 1 处,“结束”在 8 处。你应该在结尾处收到什么作为 prev/next 呢?也许None?这样做可能最简单:

        >>> a = [None] + a + [None]
        >>> for i, j, k in zip(a, a[1:], a[2:]):
        ...  print i, j, k
        ... 
        None 0 1
        0 1 2
        1 2 3
        2 3 4
        3 4 5
        4 5 6
        5 6 7
        6 7 8
        7 8 9
        8 9 None
        

        【讨论】:

          【解决方案6】:

          我知道的最简单的方法是

          for x,next in zip (a, a[1:]):
            # now you have x and next available
          

          【讨论】:

            猜你喜欢
            • 2020-11-03
            • 2011-03-02
            • 1970-01-01
            • 2022-12-19
            • 2010-09-07
            • 2012-02-25
            • 1970-01-01
            • 1970-01-01
            • 2020-11-25
            相关资源
            最近更新 更多