我有一个正在循环的数组,我想将每个元素与它旁边的元素进行比较,如果它更大,那么我想对它的索引做些什么。我很清楚枚举在这种情况下会有帮助;然而,我遇到了一个'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]:
....