0

我到处搜索,即使有几个关于这个错误的问题和答案,我也找不到解决问题的解决方案

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

  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()

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

4

5 回答 5

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:
于 2012-11-13T23:47:50.607 回答
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]]
于 2012-11-13T21:42:24.967 回答
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)]           
于 2012-11-13T22:06:42.360 回答
0

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

于 2012-11-13T21:37:54.413 回答
0

问题在这里:

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

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

于 2012-11-13T21:38:24.460 回答