2015-08-31 78 views
1

我需要迭代列表並比較當前元素和上一個元素。我看到兩個簡單的選項。第一:如何迭代/循環遍歷列表並引用上一個(n-1)元素

for index, element in enumerate(some_list[1:]): 
    if element>some_list[index]: 
     do_something() 

二:

for i,j in zip(some_list[:-1], some_list[1:]): 
    if j>i: 
     do_something() 

我個人不喜歡這裏nosklo的答案形式: Python - Previous and next values inside a loop 我爲什麼要設置一個輔助功能?

那麼要走的路是什麼?

PS:我使用的是Python3

回答

2

拉鍊方法可能是最常用的,但替代(這可能是更可讀)將是:

prev = None 
for cur in some_list: 
    if (prev is not None) and (prev > cur): 
     do_something() 
    prev = cur 

這顯然是不行的如果None可能發生在some_list中的某處,但否則它會做你想要的。

另一個版本可能會在枚舉方法的變化:

for prev_index, cur_item in enumerate(somelist[1:]): 
    if somelist[prev_index] > cur_item: 
     do_something() 

只要確保不修改somelist在循環或結果將是不可預知的。

+0

給予好評的第一個建議。沒有附加軟件包,也沒有輔助功能的定義! thx – Jochen

2

您可以使用ITER這避免了需要索引或切片:它採用三通

it = iter(some_list) 
prev = next(it) 
for ele in it: 
    if prev > ele: 
     # do something 
    prev = ele 

也有pairwise recipe在itertools:

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

for a,b in pairwise(some_list): 
    print(a,b) 
+0

upvote爲iter工具提供第一個解決方案,但與polpak的第一個解決方案相比,有什麼優勢? – Jochen