【问题标题】:list index out of range while incrementing within for loop在for循环内递增时列表索引超出范围
【发布时间】:2019-02-07 14:24:36
【问题描述】:

只是 Python 的初学者。我试图在不使用 numpy 的情况下找到矩阵的转置。我的代码如图:

import fileinput

order = int(raw_input())
arr_input = [int(num) for num in raw_input().split(' ')]
arr = []
index = 0
for i in range(order):
    for j in range(order):
        arr[j][i] = arr_input[index] 
        print(index, i , j)
        index += 1

print(arr)

上面写着IndexError: list index out of range,据我了解,循环终止,而index 增加到9 但我没有访问arr_input[9],那么为什么会出现错误?任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • 输入是什么?欢迎来到堆栈溢出!请使用tour 并通读help center,尤其是[how-to-ask] 您最好的选择是进行研究,搜索有关 SO 的相关主题,然后试一试。如果您在进行更多研究和搜索后卡住并且无法摆脱卡住,请发布您的尝试示例 minimal reproducible example 并具体说明您卡在哪里。
  • i/p: 3 (newline) 1 2 3 4 5 6 7 8 9 o/p: Traceback(最近一次调用最后):文件“transpose.py”,第 13 行,在 arr[j][i] = arr_input[index] IndexError: list assignment index out of range
  • @seema 如果您有其他信息,请编辑您的问题。您无法在 cmets 中格式化代码,人们往往不会阅读它。

标签: python arrays list indexing transpose


【解决方案1】:

这是循环的第一次迭代发生的情况:

arr = []
i = 0
j = 0
arr[i][j] = ...

REPL 中尝试一下。

>>> arr = []
>>> i = 0
>>> j = 0
>>> arr[i][j] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

那么发生了什么?

  • arr[0][0] = 1 表示“将列表arr[0] 的第一项设置为1。”

  • arr[0] 表示“列表的第一项arr。”

  • arr 是一个空列表;它没有第一项。因此,该程序状态的表达式 arr[0] 是错误的。

我们如何解决它?我们需要确保为每一行创建一个列表。

# Create a blank matrix
for j in range(order):
    arr[j] = []

# Now fill in the values
for i in range(order):
    for j in range(order):
        arr[j][i] = ...

【讨论】:

  • 我不确定 REPL 对于初学者来说是不言自明的。
【解决方案2】:

您必须稍微修改您的代码才能使其正常工作。

import fileinput

order = int(input())
arr_input = [int(num) for num in input().split(' ')]
arr = []
index = 0

for j in range(order):
    arr.append([])

for i in range(order):
    for j in range(order):
        print(index, i , j)
        arr[j].append(arr_input[index])
        index += 1

print(arr)

我可以解释为什么您会收到 IndexError: list index out of range

arr[j][i] = arr_input[index] 

通过这行代码,您试图访问数组 arr 的第 j 行和第 i 列,但 arr 只是一个空数组。 所以首先你必须这样做

for j in range(order):
        arr.append([])

p.s:在空数组中赋值时,总是使用 append() 方法来避免“列表索引超出范围错误”。

希望对你有帮助

【讨论】:

  • 将空行附加到数组 arr 的第 j 个,但在分配 arr[j][i] = arr_input[index] 时,它显示相同的错误。
  • 在附加空行或更简单的之后,我们可以说您已将空列表附加到 arr。由于这些列表是空的,因此必须附加而不是分配值。使用 arr[j].append(arr_input[index]) 代替 arr[j][i] = arr_input[index]。请参考我的代码。
  • 哦,是的,我的错。谢谢 ! :D
猜你喜欢
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多