【问题标题】:Indexing error after removing line from 2D array从二维数组中删除线后的索引错误
【发布时间】:2020-10-28 00:28:53
【问题描述】:

我在尝试对从 CSV 提取创建的表迭代 for 循环时遇到 'List Index out of range' 错误,但无法弄清楚原因 - 即使在之后尝试许多不同的方法。

这是错误发生方式的分步说明:

  1. 我正在删除导入的 CSV 文件的第一行,因为 行包含列的名称但没有数据。 CSV 具有以下结构。
columnName1, columnName2, columnName3, columnName4
This,        is,          some,        data
I,           have,        in,          this
very,        interesting, CSV,         file
  1. 在将 CSV 存储在名为 oldArray 的第一个数组中后,我想填充一个 newArray,它将从 oldArray 中获取所有值,但 不是 第一行,即列名行,如前所述 提及。我的 newArray 应该看起来像这样。
This,        is,          some,        data
I,           have,        in,          this
very,        interesting, CSV,         file
  1. 要创建这个 newArray,我将以下代码与 append() 函数结合使用。
tempList = []
newArray = []
for i in range(len(oldArray)):
        if i > 0:   #my ugly way of skipping line 0...
                for j in range(len(oldArray[0])):
                        tempList.append(oldArray[i][j])
                newArray.append(tempList)
                tempList = []
  • 我还将这些列存储在自己的单独列表中。
i = 0
for i in range(len(oldArray[0])):
        my_columnList[i] =  oldArray[0][i]
  1. 接下来会出现错误:我现在想使用 for 循环和插入(在函数中)从此 newArray 填充树视图表。但我总是得到“索引列表超出范围错误”,我不知道为什么。
def populateTable(my_tree, newArray, my_columnList):
        i = 0        
        for i in range(len(newArray)):
                my_tree.insert('','end', text=newArray[i][0], values = (newArray[i][1:len(newArray[0]))
                #(im using the text option to bypass treeview's column 0 problem)
        return my_tree

错误消息 --> “文件”(...我的工作目录...)”,第 301 行,在 populateTable my_tree.insert(parent='', index='end', text=data[i][0], values=(data[i][1:len(data[0])])) IndexError:列表索引超出范围“

对不同的数据集和列使用相同的函数效果很好,但这里 newArray 不适用。

我确信错误完全来自这个“newArray”,并且没有链接到另一个参数。

我已经测试了列列表的有效性,通过一些 print() 函数在 oldArray 中导入 CSV,一切看起来都很正常 - 值、行维度、列维度。

这对我来说是一个很大的谜...... 非常感谢大家的帮助和时间。

【问题讨论】:

  • 与您使用的代码完全相同吗?在数字 4 中,值 values = (newArray[i][1:len(newArray[0])) 似乎是错误的。最好写完整的错误信息。
  • 嗨,这确实是我正在使用的相同代码 - 至于值 = (newArray[i][1 : len(newArray[0]),我可以确认这是有效的:我'已经在其他表上尝试过,它没有问题。只是这里的这个'newArray'会引起麻烦。整个错误消息是:“文件”(......我的工作目录......)“,第301行,在 populateTable my_tree.insert(parent='', index='end', text=data[i][0], values=(data[i][1:len(data[0])])) IndexError: list索引超出范围“

标签: python for-loop indexing


【解决方案1】:

您可以从您的错误消息中找到问题:File "(...my working directory...)", line 301, in populateTable my_tree.insert(parent='', index='end', text=data[i][0], values=(data[i][1:len(data[0])])) IndexError: list index out of range

表示第 301 行有一个超出范围的索引:data[i][0]data[i][1:len(data[0])]

i 结束 len(data))或(01 结束 len(data[0])

我猜数据中有一些空列表(可能是data[-1]?)。

如果data[i] 是[] 或[some_one_item],则data[i][1:len(data[0])] 尝试访问第二个不存在的项目。

【讨论】:

  • 感谢您的回复!您已经指出我的数据数组确实没有 no 维度 - 在您的消息之后,我尝试了以下测试值,均返回 List Index 错误:test0 = newArray[0][ 0] ; test1 = newArray[-1][0] ; test2 = newArray[-2][0] ; test3 = newArray[0][1]。我想知道这怎么可能?...(下面的错误示例) test1 = insightData[0][0] IndexError: list index out of range
  • @tka2021 oldArray 有价值吗?打印len(oldArray)len(newArray)
  • 刚刚尝试过:oldArray 确实有值,例如 oldArray[0][0] == columnName1 ; oldArray[1][0] == 这个。关于长度: len(oldArray) == 4 符合预期,但 len(newArray) == 0。也许这意味着我的 append() 代码行不起作用?
  • 如果您没有特定的理由来制作新列表,那么使用oldArray[0]oldArray[1:] 代替my_columnListnewArray 怎么样?
  • 而在populateTree 中,my_columnList 没有被使用。 my_tree.insert('','end', text=newArray[i][0], values = (newArray[i][1:len(newArray[0])) 对吗?或my_tree.insert('','end', text=my_columnList[i], values = (newArray[i])) ?
【解决方案2】:

跳过第 0 行的“丑陋”方式没有问题,但我建议您看看这种方式

new_array = old_array.copy()
new_array.remove(new_array[0])

现在来解决您的问题 看起来你的索引有问题 当您使用使用数组长度范围的 for 循环时,您会使用从 1 开始的普通索引,同时您将 i 变量标识为零

为了简单

len(oldArray[0])

这等于 4,所以当你在 for 循环中使用它时,就像说

for i in range(4):

要解决此问题,您可以从旧数组的长度中减去 1,或者仅在第一个时将 i 变量标识为 1

i = 1
for i in range(len(oldArray[0])):
    my_columnList[i] =  oldArray[0][i]

i = 0
for i in range(len(oldArray[0])-1):
    my_columnList[i] =  oldArray[0][i]

这个错误在你的 populateTree 函数中也重复出现 所以就像你的代码一样

def populateTree(my_tree, newArray, my_columnList):
    i = 0        
    for i in range(len(newArray)-1):
            my_tree.insert('','end', text=newArray[i][0], values = (newArray[i][1:len(newArray[0]))
            #(im using the text option to bypass treeview's column 0 problem)
    return my_tree

【讨论】:

  • 嗨,艾哈迈德,感谢您提供有关复制/删除行的提示,我一定会尝试一下!感谢 Canasta 的回答,我对我的问题进行了更多研究,看来我的 newArray 有......根本没有维度?只需键入 test1 = newArray[0][0] 也会返回一个“索引错误”...鉴于我之前的代码,我什至不知道这是怎么发生的...
猜你喜欢
  • 2018-12-26
  • 1970-01-01
  • 2021-06-26
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2019-08-05
  • 2021-11-07
相关资源
最近更新 更多