我到处搜索,即使有关于此错误的一些问题和答案,我找不到解决方案来解决我的问题
我正在从包含字母和数字的文件中读取内容,并根据该文件中的值填充矩阵。 例如:文件 字母和数字的描述...... 表:
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()
我不明白为什么我一直收到这个错误。
答案 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矩阵。