那么......在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??
答案 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)
如果每个迭代都需要循环序列中的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
答案 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)