python中的错误:列表赋值索引超出范围

时间:2012-11-13 21:35:42

标签: python

我到处搜索,即使有关于此错误的一些问题和答案,我找不到解决方案来解决我的问题

我正在从包含字母和数字的文件中读取内容,并根据该文件中的值填充矩阵。 例如:文件 字母和数字的描述...... 表:

  a b c d 
a 1 2 5 6
b 5 6 3 4 
c 3 2 1 4 
d 2 4 6 8 

这是代码

matrix = [[0 for j in range(4)] for i in range(4)]
i = 0
j = 0

for line in file:
   for a in line:
      if is_number(a):
         matrix[i][j] = int(a)
         j+= 1
      if matrix.count(0) < 2: #since matrix already populated with zeroes. it shouldn't have 
                               #many per program specifications, that's why I use this 
                               #conditional to increment i and reset j back to 0
         i += 1
         j = 0

file.close()

我不明白为什么我一直收到这个错误。

5 个答案:

答案 0 :(得分:2)

我看到两种可能的方法可能会导致代码中出现IndexError。

出现第一个问题是因为您正在迭代正在阅读的文件。你的代码:

for line in file:
    for a in line:
        if is_number(a):
            # do stuff

将文件中的一行读入变量line。然后,每个字符都存储在变量a中,并检查它是否为数字。如果您正在读取的任何整数大于9,您将看到IndexError,因为它将每个数字计为一个单独的数字,导致您最终在预分配的数组中耗尽空间。

可能的解决方法是更改​​行:

for a in line:

for a in line.split()

将该行拆分为单词列表(即由空格分隔的所有内容的新条目)。因此,"6 12 4 5"将变为[6,12,4,5],使其不会分别计算12中的1和2。

我在您的代码中看到的第二个问题是:

if matrix.count(0) < 2:

如果您的输入文件包含零,则会导致此行在循环的一次迭代中保持为真,而不是您想要的。可能的解决方法是将行更改为:

if j == len(matrix[0]) - 1:

答案 1 :(得分:1)

尝试这样的事情:

with open("data1.txt") as f:
    next(f)                  #skip the first line
    lis=[map(int,x.split()[1:]) for x in f]  #use x.split()[1:] to remove the alphabet
    print lis

<强>输出:

[[1, 2, 5, 6], [5, 6, 3, 4], [3, 2, 1, 4], [2, 4, 6, 8]]

答案 2 :(得分:1)

如果您知道输入文件已经有正确的矩阵(逐行)布局,您可以使用以下内容:

matrix = filter(lambda x: len(x)>0, [[int(a) for a in l.split() if is_number(a)] for l in file])

如果您对输入布局没有任何期望,可以尝试:

data = open("test").read()
l = filter(lambda x: is_number(x), data.replace("\n"," ").split())
width = int(math.sqrt(len(l)))
print [[int(l[i+width*j]) for i in range(width)] for j in range(width)]           

答案 3 :(得分:0)

您在第一行代码中构建了一个4x4矩阵,但您的数据是一个6x6矩阵。当您尝试在第0行的索引4处存储元素时,会得到IndexError

答案 4 :(得分:0)

问题在于:

matrix = [[0 for j in range(4)] for i in range(4)]

您的矩阵是6x6,但您的代码仅补偿4x4矩阵。