web-dev-qa-db-fra.com

Python: TypeError: les index de liste doivent être des entiers, pas de str

Je vais faire Matrix Addition sur Python. (Pas fini). Mais cela montre une erreur.

m, n = (int(i) for i in raw_input().split())
a = [[0 for i in range(m)] for j in range(n)]
b = [[0 for i in range(m)] for j in range(n)]
c = []
total = []

for i in range(m):
    x = raw_input()
    for j in range(n):
        value = [int(i) for i in x.split()]
    c[i][j] = a[i][j]
    #c.append(value)
print a
for i in c:
    print i

Je veux entrer

3 3 <- dimension de la matrice m * n

1 2 3>

3 2 1> matrice A

1 3 2>

1 1 1>

1 1 1> matrice B

1 1 1>

et montre comme

2 3 4>

4 3 2> matrice A + B

2 4 3>

Vous utilisez i dans votre boucle for externe et il s’agit d’un entier. Ensuite, dans la boucle, vous avez:

value = [int(i) for i in x.split()]

qui fait i une chaîne (qui est ce que split renvoie). Vous pensez peut-être qu’il existe une sorte de portée à l’intérieur de [ ]? Il n'y a pas. Vous avez une collision de noms, changez l'un d'entre eux.

7
cdarke

Vous utilisez la même variable dans la boucle interne.

for i in range(m):
    x = raw_input()
    for j in range(n):
        # variable i is refering to outer loop
        value = [int(p) for p in x.split()]
    c[i][j] = a[i][j]
    #c.append(value)
print a
for i in c:
    print i
1
Nilesh

Au-delà des deux premières réponses, vous aurez un problème avec cette déclaration:

c[i][j] = a[i][j]

Lorsque la boucle commencera, i sera 0 et jusqu'à présent, OK, mais c est une liste vide et n'a pas de valeur itérable à la première position, donc c[0][0] renvoie une erreur .

#c.append(value)

MODIFIER:

Votre code ne vous retournera pas ce que vous voulez. Vous feriez mieux de faire quelque chose comme ceci pour créer une matrice avec les côtés donnés:

for i in range(m):
    d = []
    for j in range(n):
        x = raw_input()
        d.append(int(x))
     c.append(d)

Si vous avez 3 pour m et n, vous créerez une matrice avec des côtés 3 x 3 enregistrés dans la variable c..__, ce qui vous évitera de scinder l'entrée utilisateur. L'utilisateur peut donner un numéro à la fois. Et vous pouvez même changer la ligne suivante:

x = raw_input()

à:

x = raw_input("{0}. row, {1}. column: ".format(i+1, j+1))

Essaye le!

1
cezar

vous pouvez également frapper cette erreur si vous déclarez un int et le traitez comme un dict

>>> a = []
>>> a['foo'] = 'bar'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str
0
r_2
import time
m, n = (int(i) for i in raw_input().split())
a = []
b = []
total = [[0 for i in range(n)] for j in range(m)]

for i in range(m):
    x = raw_input()
    for j in range(n):
        value = [int(i) for i in x.split()]
    a.append(value)
#print a


for i in range(m):
    x = raw_input()
    for j in range(n):
        value = [int(i) for i in x.split()]
    b.append(value)
#print b


for i in range(m):
    for j in range(n):
        total[i][j] = a[i][j] + b[i][j]


for i in total:
    print ' '.join(map(str, i))
time.sleep(2)

D'ACCORD! Je viens de le comprendre! Je vous remercie