在for循环中获取下一个和上一个值有简单的方法吗?

4

那么,在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,你期望的输出是什么? - gcarvelli
那么对于第二段代码片段,假设x在索引1处达到4,是否有内置函数返回5? - pyramidface
@pyramidface:你的问题非常抽象。你想用下一个和上一个值做什么?如何获取它们可能取决于你想要做什么。 - Ned Batchelder
有用的问题。Java实现了这样的流,而Python没有。 - JulienD
我故意让它开放式的。我只是想知道Python中是否有一个内置函数可以轻松地获取下一个值。其中一种用法是查看字符串中的下一个值是否为字母或数字。 - pyramidface
6个回答

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

如果您想要三个项目(上一页、项目、下一页),可以这样做:
>>> 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

3
你可以使用 itera 转换成一个迭代器,然后在迭代过程中遍历它。这样可以使用 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
>>>

我以前没见过这个。谢谢分享。 - pyramidface

3
我所知道的最简单方法是:
for x,next in zip (a, a[1:]):
  # now you have x and next available

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

1

this is easy too:

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

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接