如何迭代/循环遍历列表并引用前一个(n-1)元素

时间:2015-08-31 21:59:12

标签: python python-3.x for-loop

我需要迭代一个列表并比较当前元素和前一个元素。我看到两个简单的选择。第一:

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 个答案:

答案 0 :(得分:2)

zip方法可能是最常用的方法,但另一种选择(可能更具可读性)将是:

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

如果在some_list中某处出现None,这显然不会起作用,但除此之外它会做你想要的。

另一个版本可能是枚举方法的变体:

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

请确保不要在循环中修改某个列表,否则结果将无法预测。

答案 1 :(得分:2)

您可以使用它来避免索引或切片的需要:

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

itertools中还有pairwise recipe使用tee:

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)