Python 如何在列表上迭代/循环并引用前面的(n-1)元素?

Python 如何在列表上迭代/循环并引用前面的(n-1)元素?,python,python-3.x,for-loop,Python,Python 3.x,For Loop,我需要遍历一个列表并比较当前元素和前一个元素。我看到两个简单的选择 1) 使用枚举和索引来访问项目 2) 对连续的项目对使用zip() 3) itertools 我个人不喜欢 那么,在Python 3中,该怎么办呢?zip方法可能是最常用的方法,但另一种方法(可能更具可读性)是: prev = None for cur in some_list: if (prev is not None) and (prev > cur): do_something() prev

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

1) 使用枚举和索引来访问项目 2) 对连续的项目对使用zip() 3) itertools 我个人不喜欢


那么,在Python 3中,该怎么办呢?

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

prev = None
for cur in some_list:
   if (prev is not None) and (prev > cur):
       do_something()
   prev = cur
如果某个_列表中的某个地方没有发生任何事件,那么这显然不起作用,否则它会满足您的需求

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

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

只需确保不要修改循环中的somelist,否则结果将不可预测。

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

prev = None
for cur in some_list:
   if (prev is not None) and (prev > cur):
       do_something()
   prev = cur
如果某个_列表中的某个地方没有发生任何事件,那么这显然不起作用,否则它会满足您的需求

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

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

只需确保不要修改循环中的某些列表,否则结果将无法预测。

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

it = iter(some_list)
prev = next(it)
for ele in it:
     if prev > ele:
         # do something
    prev = ele
还有使用tee的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)

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

it = iter(some_list)
prev = next(it)
for ele in it:
     if prev > ele:
         # do something
    prev = ele
还有使用tee的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)

投票赞成第一个建议。没有额外的软件包,也没有辅助函数的定义!请注意第一个建议。没有额外的软件包,也没有辅助函数的定义!对于iter工具的第一个解决方案,ThxUpNote表示支持,但与polpak的第一个解决方案相比有什么优势?对于iter工具的第一个解决方案,upvote表示支持,但是与polpak的第一个解决方案相比,它有什么优势?您必须告诉我们
do\u something()
是什么,在Python中,您通常不需要循环,您需要列表理解。特别是如果你的代码正在构建一个新的列表/dict/等等,你必须告诉我们什么是
dou\u something()
,在Python中,你通常不需要循环,而是需要列表理解。尤其是当您的代码正在构建一个新的列表/dict/etc时。