2010-10-31 22 views
1

可能重複:
Python: Looping through all but the last item of a list閱讀其他項目,同時通過它迭代

是否有通過列表迭代時,你還需要下一個項目一個更好的方法(或任何其他任意項目)在列表中?我用這個,但也許有人可以做的更好......

values = [1, 3, 6, 7 ,9] 
diffs = [] 
for i in range(len(values)): 
    try: diffs.append(values[i+1] - values[i]) 
    except: pass 

print diffs 

給出:

[2, 3, 1, 2] 
+0

相關:http://stackoverflow.com/questions/323750/。 – 2010-10-31 09:47:00

回答

1

你可以在你的情況下使用

for pos, item in enumerate(values): 
    try: 
     diffs.append(values[pos+1] - item) 
    except IndexError: 
     pass 

雖然(因爲你只是希望爲下一個值),你也可以簡單地使用

for item,nextitem in zip(values, values[1:]): 
    diffs.append(nextitem-item) 

其也可以表示爲一個列表理解:

diffs = [nextitem-item for item,nextitem in zip(values, values[1:])] 
+0

刪除了我先前的評論。如果列表長度大於100個元素,那麼這確實比'if'更便宜。所以這不是'非常大的',因爲我聲稱這是提高效率所必需的。對困惑感到抱歉。帶有'itertools.islice'的 – aaronasterling 2010-10-31 09:58:34

4
>>> values = range(10) 
>>> values 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> zip(values[0:],values[1:]) 
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9)] 
+1

當然是足夠大的列表。 – aaronasterling 2010-10-31 09:48:14

+0

雖然這在這種情況下可行,但獲取物品索引和物品的方法是使用「枚舉」生成器 - 請檢查@Tim Pietzcker的回答 – jsbueno 2010-10-31 12:41:17

+1

@jsbueno - 真實但無關緊要,重點是配對物品在列表中不要獲得可迭代的索引。 @aaron:的確如此! – katrielalex 2010-10-31 14:31:51

1
for i, j in zip(values, values[1:]): 
    j - i 
+1

對於大列表和Python 2.x,itertools.izip可能更有效。 – 2010-10-31 09:46:47

1
diff = [values[i+1] - values[i] for i in range(len(values)-1)] 
2

什麼有關使用的輔助pairwise recipe from itertools document

from itertools import tee, izip 

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 
def main(): 
    values = [1, 3, 6, 7 ,9] 
    diffs = [post - prior for prior, post in pairwise(values)] 
    print diffs 


if __name__ == "__main__": 
    main() 

輸出
[2,3,1 ,2]

0
[y - x for x,y in zip(L,L[1:])] 
+0

你還沒有見過以前的答案,對嗎? – SilentGhost 2010-10-31 16:56:07