Python Can';我不明白为什么我总是得到一个“a”;列表索引超出范围“;错误。有人能帮我吗?
我一直收到一个“列表索引超出范围”的错误,但不知道为什么。有人能帮忙吗Python Can';我不明白为什么我总是得到一个“a”;列表索引超出范围“;错误。有人能帮我吗?,python,Python,我一直收到一个“列表索引超出范围”的错误,但不知道为什么。有人能帮忙吗 arr = [] if __name__ == '__main__': x = int(input()) y = int(input()) z = int(input()) n = int(input()) for x in range (x+1): for y in range(y+1): for z in range(z+1): arr.
arr = []
if __name__ == '__main__':
x = int(input())
y = int(input())
z = int(input())
n = int(input())
for x in range (x+1):
for y in range(y+1):
for z in range(z+1):
arr.append([x,y,z])
for i in range(len(arr)):
if (arr[i][0] + arr[i][1] + arr[i][2] == n):
del arr[i]
print(arr)
之所以会发生这种情况,是因为在遍历列表时,列表发生了变化。在您的特定示例中,实际上最好从旧列表创建一个新列表。在本例中:
arr = [x for x in arr if (x[0] + x[1] + x[2] != n)]
编辑:除了关于此活动相对于main的范围的注释之外。最好建立一个这样的列表作为理解,这样您可以在构建列表时过滤元素,而不必返回并在事后尝试提取它们:
x, y, z, n = (int(input()) for _ in range(4))
arr = [
[i, j, k]
for i in range(x+1)
for j in range(y+1)
for k in range(z+1)
if i + j + k != n
]
这是因为您迭代了数组的len,但len是在开始时计算和存储的,它不是更新。假设len 5的数组if,循环生成
0,1,2,3,4
,但是如果在循环过程中删除一项,当执行arr[4]
时,它将失败
最好的解决方案是保留感兴趣的项目,而不是删除其他项目,无论是使用另一个数组还是列表。您还可以迭代数组的值,而不是索引
# new array
new_vals = []
for v in arr:
if sum(v) != n:
new_vals.append(v)
# list comprehension
arr = [v for v in arr if sum(v) != n]
您的意思是在
if u u name_u=='\ uuuuu main_uuu'
块下只包含部分代码吗?一般来说,删除使用范围迭代的数组项是一个坏主意:范围参数在开始时计算,但是循环中的列表变短了。在循环中修改列表通常是个坏主意。在这个特殊的例子中,列表在循环的中途变短了,但是你的循环将尝试在原始列表上迭代,所以它将结束。除了上面所说的,另一个要避免的做法是命名迭代器变量(在本例中,的x
,y
,z
,对于…
中的x,使用构建范围的变量的名称。另外,请注意,使用相同的变量作为索引和边界,如对于范围内的x(x+1)
对可读性没有帮助,可能会导致一些错误-除了y+1
或z+1
之外的任何上限都会导致错误。