是否有一种简单的方法可以在for循环中获取next和prev值?

时间:2014-11-22 02:57:47

标签: python for-loop iteration

那么......在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??

6 个答案:

答案 0 :(得分:4)

这是一个常用模式,用于迭代序列中的项目对:

>>> 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

如果你想要三个项目(prev,item,next),你可以这样做:

>>> 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.你应该收到什么作为上一个/下一个结束?也许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

答案 1 :(得分:3)

我知道的最简单方法是

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

答案 2 :(得分:3)

您始终可以将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 :(得分:1)

如果每个迭代都需要循环序列中的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

答案 4 :(得分:1)

这也很容易:

>>> 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

答案 5 :(得分:1)

可能有点矫枉过正,但我​​有时会使用以下更通用的生成器,这会产生列表或其他可迭代的任何大小的'windows'序列。 (窗口大小必须小于迭代的长度。)

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)