2012-08-17 21 views

回答

5

你幾乎有

for i, e in enumerate(L): 
    print(e, L[i-1], L[(i+1) % len(L)]) 

編輯追加MOD

+0

你將有超出範圍的問題。因爲[3 + 1]超出範圍。 – User007 2012-08-17 18:04:55

+0

謝謝,現在修復。 – Phil 2012-08-17 18:06:07

7

你可以只在L循環,採用i減號加上1模得到上一個和下一個元素。

0

在我的代碼,我會用3 moving window一個元件在通過最後一個元素前置和附加的第一元素列表:

from itertools import tee, izip, chain 

def window(iterable,n): 
    '''Moving window 
    window([1,2,3,4,5],3) -> (1,2,3), (2,3,4), (3,4,5) 
    ''' 
    els = tee(iterable,n) 
    for i,el in enumerate(els): 
     for _ in range(i): 
      next(el, None) 
    return izip(*els) 


def chunked(L): 
    it = chain(L[-1:], L, L[:1]) # (1,2,3,4,5) -> (5,1,2,3,4,5,1) 
    for a1,a2,a3 in window(it,3): # (3,1,2,3,1) -> (3,1,2), (1,2,3), (2,3,1) 
     yield (a2,a1,a3) 


## Usage example ## 
L = ['a','b','c','d'] 

for t in chunked(L): 
    print(' '.join(t)) 
0

從概念上來說,保持跟蹤項目往往比較簡單,而不是展望未來。 deque班是理想的跟蹤n以前的項目,因爲它可以讓你設置一個最大長度;追加新項目會自動推送舊項目。

from collections import deque 

l = ['a','b','c','d'] 
d = deque(l[-2:], maxlen=3) 

for e in l: 
    d.append(e) 
    print d[1], d[0], d[2] 

在這種解決方案的唯一區別是,d c a會第一,而不是最後一次。如果這很重要,你可以開始,就像你已經看到一個迭代:

from collections import deque 

l = ['a','b','c','d'] 
d = deque(l[-1:] + l[:1], maxlen=3) 

for e in l[1:] + l[:1]: 
    d.append(e) 
    print d[1], d[0], d[2] 
相關問題