Python: TypeError: elenco indici devono essere numeri interi, non str

Sto andando a fare la Matrice Aggiunta su Python.(A non finire). Ma mostra un messaggio di errore.

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

Voglio ingresso

3 3 <– matrice dimensionale m*n

1 2 3 >

3 2 1 > matrice di Un

1 3 2 >

1 1 1 >

1 1 1 > matrice B

1 1 1 >

e mostra come

2 3 4 >

4 3 2 > la matrice A + B

2 4 3 >

  • Provare a cambiare value = [int(i) for i in x.split()] per value = [int(k) for k in x.split()] ? Si utilizza i nel ciclo for + in lista di comprensione.
  • Dal 0 è un oggetto immutabile, è possibile semplificare per a = [ [0]*m for j in range(n) ].

 

5 Replies
  1. 7

    Si utilizza i nella parte esterna for loop, ed è un int. Poi il ciclo si hanno:

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

    che rende i una stringa (che è quello che split restituisce). Forse voi pensate che ci sia qualche sorta di scoping all’interno [ ]? Non c’è più. Si dispone di un nome di collisione, la modifica di uno di loro.

    • +1 si noti che Python 3 non creare un nuovo ambito per genericità.
    • ben individuato.
  2. 1

    Si utilizza la stessa variabile nel ciclo for interno.

    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
  3. 1

    Oltre i primi due risposte avrai un problema con questa dichiarazione:

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

    Quando il ciclo inizia i 0 e che finora OK, ma c è una lista vuota e non ha iterable alla prima posizione in modo c[0][0] restituirà un errore.
    Sbarazzarsi di esso e decommentare la riga seguente:

    #c.append(value)

    EDIT:

    Il vostro codice non restituire ciò che si desidera. È meglio fare qualcosa di simile per creare una matrice con il dato lati:

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

    Se hai 3 per entrambi m e n, quindi si verrà a creare una matrice con i lati di 3 x 3 salvata nella variabile c.
    In questo modo non è necessario dividere l’input dell’utente. L’utente può dare un numero alla volta. E si potrebbe anche modificare la seguente riga:

    x = raw_input()

    a:

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

    Provare!

  4. 0
    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)

    OK! Ho appena capito! Grazie

  5. 0

    si possono colpire anche questo errore se si dichiara un int e trattarla come 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

Lascia un commento