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 が発生する可能性がある 2 つの方法が考えられます。

最初の問題は、読み取り中のファイルを反復処理する方法が原因で発生します。あなたのコード:

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

これにより、行が単語のリストに分割されます (つまり、空白で区切られたすべての新しいエントリ)。となり、12 の 1"6 12 4 5"[6,12,4,5]2 を別々に数えないようにします。

あなたのコードで私が目にする 2 番目の問題は次の行にあります。

if matrix.count(0) < 2:

入力ファイルに 0 が含まれていると、ループの 1 回の繰り返しで、必要以上に長くこの行が true のままになります。可能な修正は、行を次のように変更することです。

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 に答える