在比较每个元素与其邻居时,如何避免索引超出枚举范围的错误?



我有一个正在循环的数组,我想将每个元素与它旁边的元素进行比较,如果它更大,那么我想对它的索引做些什么。我很清楚枚举在这种情况下会有帮助;然而,我遇到了一个'index out of range error':

array = [1,2,3,4]
for index,i in enumerate(array): 
if array[index]>array[index+1]: 
... 

虽然我知道还有其他方法,是否有一种方法可以使上述工作与enumerate?我尝试了enumerate(array)-1;知道这一点是行不通的。但是这种方法能修复索引错误吗?由于

我知道我们可以很容易地在for循环中使用' I '来完成上面的操作,但是我很好奇我是否可以在这里操作枚举。

你可以缩短范围:

for i, val in enumerate(array[:-1]): 
if val > array[i+1]:
# do stuff

如果你不需要索引,你可以使用zip来达到同样的效果:

for prev, crnt in zip(array, array[1:]):
if prev > crnt:
# do stuff not requiring index

切片需要O(n)额外的空间,如果你不想这样,你可以使用你原来的方法没有enumerate,但一个简单的range:

for i in range(len(array)-1): 
if array[i] > array[i+1]:
#  ...

使用zip和slice:

for i, j in zip(array, array[1:]):
print(f'i: {i} - j: {j}')

输出:

i: 1 - j: 2
i: 2 - j: 3
i: 3 - j: 4

这样做将设置index为0,i为1。在Python中,列表从0开始。所以当i=3时,你看到的是数组[i+1]=数组[4],它不存在!这就是为什么程序说'index out of range error'。

如果你想坚持使用列表,我的建议是:

array = [1,2,3,4]
for i in range(len(array)-1): 
if array[i]>array[i+1]: 
...

如果你想操作索引,那么它将是循环中的当前索引(i)。也许我没有正确理解你的问题,但我建议你使用numpy,如果你想使用数组类对象。

查尔斯

您需要为列表中的最后一个元素应用什么逻辑?

可以使用range函数而不是enumerate。

如果需要在最后一个元素上实现业务逻辑,然后在下面使用:

array = [1,2,3,4]
l = len(array)
for i in range(l-1): 
if array[i]>array[i+1]: 
... 

如果你需要在最后一个元素上实现业务逻辑,然后在下面使用:

array = [1,2,3,4]
l = len(array)
for i in range(l): 
if i==l-1:
implemet last elemt logic
else:
if array[i]>array[i+1]:
....

相关内容

  • 没有找到相关文章

最新更新