那么,在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??
这里是我在序列中迭代键值对的常用模式:
>>> 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
iter
将 a
转换成一个迭代器,然后在迭代过程中遍历它。这样可以使用 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
>>>
for x,next in zip (a, a[1:]):
# now you have x and next available
previous
和next
元素: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
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
也许有些过度了,但我有时会使用以下更通用的生成器来处理这个问题,它可以在列表或其他可迭代对象上产生任意大小的“窗口”序列。(窗口大小必须小于可迭代对象的长度。)
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)
x = 4
,你期望的输出是什么? - gcarvelli