2010-10-23 28 views
3

可能重複:
Python - Previous and next values inside a loop
python for loop, how to find next value(object)?Python列表:如何在使用循環時讀取前一個元素?

嗨,大家好。

我有一個包含很多元素的列表,我使用for循環迭代列表。 例如

li = [2,31,321,41,3423,4,234,24,32,42,3,24,,31,123] 

for (i in li): 
    print i 

但我想我的前一個元素,如何做到這一點?

我不必使用for循環,所以請隨時在這裏更改任何內容。謝謝!

+0

[some](http://stackoverflow.com/questions/323750/how-to-access-previous-next-element-while-for-looping)[other](http://stackoverflow.com/questions/ 1281752/access-elements-with-offsetsets-in-pythons-for-in-loops)[鏈接](http://stackoverflow.com/questions/522563/accessing-the-index-in-python-for-loops) – aaronasterling 2010-10-23 05:33:07

+0

可能重複[python for循環,如何找到下一個值(對象)?](http://stackoverflow.com/questions/3929039/python-for-loop-how-to-find-next-valueobject/3929075# 3929075) – 2010-10-23 05:54:02

回答

1

使用循環計數器作爲索引。 (請務必使您在範圍內停留,開始在一個)。

for i in range(1,len(li)): 
    print li[i], li[i-1] 
6

通過指數

li = range(10) 

for i, item in enumerate(li): 
    if i > 0: 
     print item, li[i-1] 

print "or..." 
for i in range(1,len(li)): 
    print li[i], li[i-1] 

輸出只要保持指數的跟蹤,並得到前一個項目:

1 0 
2 1 
3 2 
4 3 
5 4 
6 5 
7 6 
8 7 
9 8 
or... 
1 0 
2 1 
3 2 
4 3 
5 4 
6 5 
7 6 
8 7 
9 8 

另一另一種方法是記住最後一項,例如

last_item = None 
for item in li: 
    print last_item, item 
    last_item = item 
-1
li = [2,31,321,41,3423,4,234,24,32,42,3,24,,31,123] 

counter = 0 
for l in li: 
    print l 
    print li[counter-1] #Will return last element in list during first iteration as martineau points out. 
    counter+=1 
+0

你錯了第一次迭代引發的異常。 'alist [-1]'是列表的最後一個元素。聽起來不像你試着自己運行它 - 不值得一試。 – martineau 2010-10-23 12:07:57

+0

謝謝 - 今天我學到了一些東西。:-) – jMyles 2010-10-23 19:11:43

16

通常情況下,你使用enumeraterange()要經過的元素。這裏的每個元組的替代

>>> li = [2,31,321,41,3423,4,234,24,32,42,3,24,31,123] 
>>> zip(li[1:],li) 
[(31, 2), (321, 31), (41, 321), (3423, 41), (4, 3423), (234, 4), (24, 234), (32, 24), (42, 32), (3, 42), (24, 3), (31, 24), (123, 31)] 

的第二個元素是列表中的前一個元素。

+0

+ 1很好的回答! – rubik 2010-10-23 07:00:37

+0

爲什麼在第二行中使用術語「li [1 ::]'而不是'li [1:]'? – martineau 2010-10-23 11:53:17

+0

只是一個錯字。固定。謝謝 – ghostdog74 2010-10-23 11:56:00

12

您可以使用壓縮:

for a, b in zip(li, li[1:]): 
    print a, b 

,或者,如果你需要做一些票友一點,因爲建立一個列表或服用裏一片是低效的(出於某種原因...)

import itertools 

readahead = iter(li) 
next(readahead) 

for a, b in itertools.izip(li, readahead) 
    print a, b 
+2

爲itertools答案+1,而不是第一個。如果列表很小,第一個很好,但如果列表非常大,則創建副本效率不高。 – snapshoe 2010-10-23 15:58:53

0
j = None 
for i in li: 
    print j 
    j = i 
+0

+1快速而相當不錯的解決方案。 – Tadeck 2012-03-02 02:58:19

2

使用itertools配方的選項從here

from itertools import tee 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

for i, j in pairwise(li): 
    print i, j 
+0

@ TokenMacGuy的答案的第2部分似乎是一個很簡單的方法來實現這一點。 – martineau 2010-10-23 12:13:38

+0

@martineau:不是很多。唯一真正的區別是使用'tee'。他們實現不同的事情。如果'li'是一個普通的迭代器而不是列表,@ TokenMacGuy的答案不起作用,它會跳過對。這就是'tee'在這裏使用的原因。我正在嘗試更多的關注美麗的'itertools'食譜('pairwise'是從那裏複製的),而不是重新發明輪子。 – 2010-10-23 12:59:12

相關問題