web-dev-qa-db-ja.com

TypeError:リストインデックスはリストではなく整数でなければなりません。直し方?

TypeErrorを含むコードがあります。 「リストインデックスはリストではなく整数でなければなりません」が、整数です。何が悪いのか理解するのを手伝ってくれてありがとう。必要なのは、異なる値を持つソース7x5タブからマトリックス7x5を取得することです。エラーは最後の行で発生します。

lines = []

with open("text.txt") as f:
    for line in f:
        line = [int(x) for x in line if (x != ' ') and (x != '\n')]
        lines.append(line)
    f.close()

ファイルを読んだ後に持っているのは、「行」と呼ばれる番号のリストのリストです。それは整数です。文字列ではありません。お気に入り:

>> [[1, 2, 3...], [4, 5, 6...], [7, 8, 9...],[...]]


i = 1
j = 1
T = []
T.append(lines[0][0]) 

最後の行(i-1など)。しかし、私はそれが実際にはpython-wayだとは思いません。私もこのことで助けていただければ幸いです。

for i in lines:
    for j in lines:
        T[i][j] = lines[i][j] + max(T[i][j-1], T[i-1][j])

ここでエラーが発生します。 ijがすでにintである場合、何を修正すればよいかわかりません。

6
Larleyt

ijはインデックスではありません。それらはlinesリストの値です。 Python forループは for-each構文 です。

使用する:

for i, line in enumerate(lines):
    for j, value in enumerate(line):
        T[i][j] = value + max(T[i][j - 1 % len(T[i])] + T[i - 1 % len(T)][j])

ここで、% len()計算は、Tおよび/またはiT[i]の場合、jまたは0の最後のエントリに「ラップアラウンド」します。 enumerate() function は、ループにインデックスを追加します。

これは、Tにリスト構造のネストされたリストがすでに作成されていることを前提としています。

5
Martijn Pieters
for i in lines:
    for j in lines:

ijは、インデックスではなく、linesの要素を反復処理します。つまり、ijは常にリストであり、数字の行全体です。

インデックスを調べたい場合(通常は調べませんが、ここでは最良のオプションかもしれません)、

for i in range(len(lines)):
    for j in range(len(lines[i])):

Python設計者は、デフォルトでシーケンスの要素を反復処理することを望んでいるため、これは設計上厄介です。

また、ループは最初の行の前と最初の列の前にlinesの要素にアクセスしようとすることに注意してください。おそらく、2番目の行と列でループを開始したいと思うでしょう。