2014-11-22 19 views
4

所以...有一個簡單的方法來獲取下一個和以前的值,而在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?? 
+0

你能舉個例子嗎?如果'x = 4',你預期的輸出是什麼? – gcarvelli 2014-11-22 03:00:59

+0

因此,對於第二個代碼片段,讓我們假設x在索引1處命中4,是否有內置函數返回5? – pyramidface 2014-11-22 03:03:28

+0

@pyramidface:你的問題很抽象。您希望如何處理下一個和以前的值?你如何得到它們可能取決於你想要做什麼。 – 2014-11-22 03:33:55

回答

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
我知道

最簡單的方法是

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

你總是可以轉換成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 
>>> 
+0

我以前沒見過這個。感謝分享。 – pyramidface 2014-11-22 03:11:37

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 
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 
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) 
相關問題