用下面的例子列表:L = ['a','b','c','d']
如何在循環列表中循環,同時在當前元素前面和後面查看?
我想達到以下的輸出:
>>> a d b
>>> b a c
>>> c b d
>>> d c a
僞代碼將是:
for e in L:
print(e, letter_before_e, letter_after_e
用下面的例子列表:L = ['a','b','c','d']
如何在循環列表中循環,同時在當前元素前面和後面查看?
我想達到以下的輸出:
>>> a d b
>>> b a c
>>> c b d
>>> d c a
僞代碼將是:
for e in L:
print(e, letter_before_e, letter_after_e
你幾乎有
for i, e in enumerate(L):
print(e, L[i-1], L[(i+1) % len(L)])
編輯追加MOD
你可以只在L
循環,採用i
減號加上1模得到上一個和下一個元素。
,很可能會矯枉過正,在這種情況下,但這是一般使用情況的循環雙向鏈表http://ada.rg16.asn-wien.ac.at/~python/how2think/english/chap17.htm
在我的代碼,我會用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))
從概念上來說,保持跟蹤項目往往比較簡單,而不是展望未來。 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]
你將有超出範圍的問題。因爲[3 + 1]超出範圍。 – User007 2012-08-17 18:04:55
謝謝,現在修復。 – Phil 2012-08-17 18:06:07