比较列表中所有相邻元素的Python方法

比较列表中所有相邻元素的Python方法,python,python-3.x,Python,Python 3.x,我想知道是否有一种更像蟒蛇的方式来做以下事情: A = some list i = 0 j = 1 for _ in range(1, len(A)): #some operation between A[i] and A[j] i += 1 j += 1 我觉得这应该/可以做得不同。想法 编辑: 因为有些人要求要求。我想要一个通用的答案。也许是为了检查A[i],A[j]是否在某个范围内,或者它们是否相等。或者也许我想做一个“涓涓细流”的元素。越普遍越好 你可以做: A

我想知道是否有一种更像蟒蛇的方式来做以下事情:

A = some list
i = 0
j = 1
for _ in range(1, len(A)):
    #some operation between A[i] and A[j]
    i += 1
    j += 1
我觉得这应该/可以做得不同。想法

编辑: 因为有些人要求要求。我想要一个通用的答案。也许是为了检查A[i],A[j]是否在某个范围内,或者它们是否相等。或者也许我想做一个“涓涓细流”的元素。越普遍越好

你可以做:

A = some list
for Ai, Aj in zip(A, A[1:]):
    #some operation between A[i] and A[j]
用于组合多个迭代器:

for i,j in zip(range(0,len(A)-1), range(1,len(A))):
    #some operation between A[i] and A[j]
也可以在范围对象上使用:

for i,j in enumerate(range(1,len(A)):
    #some operation between A[i] and A[j]
请注意,与其他答案不同,这使您能够访问A的索引,而不仅仅是项目,如果您想使用
A[i]
A[j]
的任何赋值,这是必要的,例如,这里有一个非常基本的冒泡排序:

A = list(range(10))
found1=True
while found1:
    found1=False
    for i,j in enumerate(range(1,len(A))):
        if A[i] < A[j]:
            A[i],A[j] = A[j],A[i]
            found1=True
print(A)
A=列表(范围(10))
found1=True
虽然发现1:
found1=False
对于枚举中的i,j(范围(1,len(A)):
如果A[i]
这只有在对操作“+”迭代A.

的索引时才可能:

A = [A[i+1]+A[i] for i in range(len(A)-1)]
概述:

A = [operation(A[i], A[i+1]) for i in range(len(A)-1)]

做这件事有一个很好的小诀窍。作为一种奖励,它可以与任何iterable一起工作,而不仅仅是序列

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)

for current, next_ in pairwise(A):
    # do something
    pass
如果您也需要索引,那么只需
枚举
成对迭代器即可

for current_index, (current, next_) in enumerate(pairwise(A)):
    # do something
    pass
islice
比使用
A[1://code>更通用,因为它也适用于迭代器(不可下标)。请注意,您需要将
None
作为第三个参数传递,因为
islice(iterable,stop)
只返回迭代器的第一个
stop
项(即名称),这与您想要的正好相反,当传递第三个参数时,它将第二个参数视为起始位置,而不是停止索引

islice(iterable, start, stop[, step])  # roughly = iterable[start:stop:step]
islice(iterable, stop)                 # roughly = iterable[:stop]
有关更多信息,请参阅


现在
zip()
发出值,直到
最短的
迭代器(
A2
)耗尽。因此,不必担心可能的
索引器

您不再迭代索引,而是以“是”的形式迭代元素,但如果目的是在Ai和Aj之间执行某些操作,它似乎会起作用。
zip
在这里是个好主意,假设您不需要Ai和Aj的索引。您还可以通过执行
zip(a,a[1:])
删除几个字符。当
zip
收到两个不同长度的iterable时,它只迭代到较短的iterable的末尾。因此,使用
A[:-1]
切断最后一个元素并不是绝对必要的。如果要将
A[i]
中的元素与
A[j]
切换,则不允许分配给
A[i]
因为您不跟踪索引。您是否需要访问列表的索引,或者只对没有索引的元素进行迭代对您有效?enumerate的返回值是什么。非常困惑。它是索引、值。enumerate如何知道它是索引、值还是值和下一个值@您可以使用
帮助(enumerate)
查看enumerate的帮助,其中详细介绍了enumerate的工作原理。它总是产生一个2元组的序列
索引,元素在索引处。然而,我进一步将索引处的
元素当前
下一个
(因为这是
成对产生的)。
islice(A,n)
不会跳过
n
项,而是在
n
项之后停止。应将其更改为
islice(A,1,无)
islice(iterable, start, stop[, step])  # roughly = iterable[start:stop:step]
islice(iterable, stop)                 # roughly = iterable[:stop]