所以...有一個簡單的方法來獲取下一個和以前的值,而在Python中的for循環迭代?有沒有一種簡單的方法可以在for循環中獲得next和prev值?
我知道這是可以,如果你這樣做很容易做到:
a = [3,4,5,6,3,4,5]
for x in range(len(a)):
next = a[x+1]
但怎麼樣:
for x in a:
x.next??
所以...有一個簡單的方法來獲取下一個和以前的值,而在Python中的for循環迭代?有沒有一種簡單的方法可以在for循環中獲得next和prev值?
我知道這是可以,如果你這樣做很容易做到:
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
最簡單的方法是
for x,next in zip (a, a[1:]):
# now you have x and next available
你總是可以轉換成a
一個迭代器與iter
,然後遍歷這一點。這將允許您使用next
在循環中前進,你是iterting在迭代器:
>>> 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 2014-11-22 03:11:37
如果你想同時得到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
這是一件容易的事:
>>> 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 2014-11-22 03:00:59
因此,對於第二個代碼片段,讓我們假設x在索引1處命中4,是否有內置函數返回5? – pyramidface 2014-11-22 03:03:28
@pyramidface:你的問題很抽象。您希望如何處理下一個和以前的值?你如何得到它們可能取決於你想要做什麼。 – 2014-11-22 03:33:55