2016-02-25 17 views
5

Sono molto nuovo a Python, cercando di imparare le basi. Hai un dubbio sulla lista.Come modificare gli elementi in una lista all'interno dell'elenco

dispone di un elenco:

L = [[1,2,3],[4,5,6],[3,4,6]] 

L'output dovrebbe essere:

[[2,4,6],[8,10,12],[6,8,12]] 

Il codice che funziona per me è la seguente

for x in range(len(L)): 
    for y in range(len(L[x])): 
     L[x][y] = L[x][y] + L[x][y] 
print L 

Dà l'uscita [[2,4,6],[8,10,12],[6,8,12]].

Ora voglio la stessa uscita con un codice diverso:

for x in L: 
    a = L.index(x) 
    for y in L[a]: 
     b = L[a].index(y) 
     L[a][b] = L[a][b] + L[a][b] 
print L 

Con il codice sopra l'output ottenuto è:

[[4,2,6],[8,10,12],[12,8,6]] 

ho cercato di eseguire il debug circa l'uscita di cui sopra. Ho inserito una dichiarazione di stampa sopra la riga "L[a][b] = L[a][b] + L[a][b]" per stampare ae b. Sono rimasto sorpreso di vedere i valori di A e B sono:

0,0 
0,0 
0,2 
1,0 
1,1 
1,2 
2,0 
2,1 
2,0 

Anche in questo caso se io commento la linea "L[a][b] = L[a][b] + L[a][b]" allora i valori di A e B sono come ci si aspettava:

0,0 
0,1 
0,2 
1,0 
1,1 
1,2 
2,0 
2,1 
2,2 

ho il sospetto che questo potrebbe sta accadendo a causa della portata della variabile in python e ho provato a studiare alcune cose sull'ambito dell'ambito in python. Ma non ho ottenuto risposta appropriata né per l'ambito o la domanda di cui sopra.

+1

la risposta è abbastanza evidente nel secondo ciclo della interno 'ciclo for', una volta che la si modifica' L [0] [0] 'a' 2' e poi cerca l'indice di '2', ma il tuo codice sembra inutilmente complicato, il che mi chiede di farlo chiedi .. Stai cercando di ottenere qualcosa di più semplice del tuo codice originale? – Obsidian

risposta

0

Come altre persone hanno spiegato, quando si utilizza la funzione index, trova la prima occorrenza del valore che si sta cercando. Così la prima volta attraverso voi sono loop (per la prima riga), sembra che

b = 1 
[1,2,3].find(1) # returns index 0 
#Then you modify the first element of the list 
b = 2 
[2,2,3].find(2) #returns index 0 again! 

Per ottenere gli indici in un modo più semplice, più deterministico, è possibile utilizzare la funzione di enumerate in un elenco. Ti verrà fornito un iteratore che restituisce il valore dell'indice AND mentre ti sposti all'interno di un elenco.

for rowInd, x in enumerate(L): 
    for colInd, y in enumerate(x): 
     L[rowInd][colInd] = y + y 

Si noti che questo lo farà sul posto, come nella soluzione originale.

L = [[2, 4, 6], [8, 10, 12], [6, 8, 12]]

+0

Grazie per il modo di risolvere questo. –

+0

Sicuro. Assicurati di selezionare una risposta quando ne hai la possibilità. –

0

Il modo migliore per ottenere l'output desiderato è utilizzare list comprehension. Si potrebbe fare come segue:

L = [[1,2,3], [4,5,6], [3,4,6]] 
answer = [[2*el for el in sublist] for sublist in L] 
print(answer) 

uscita

[[2, 4, 6], [8, 10, 12], [6, 8, 12]] 

Questo itera su ogni sublist nel proprio elenco L e si moltiplica ogni el nel sublist per 2, ottenendo così il risultato desiderato.

+1

Lui ha una soluzione funzionante. La domanda era perché la seconda soluzione non * funzionasse *. – zondo

+1

Inoltre, si noti che questo fa una copia della lista e il tentativo originale dell'op era di farlo sul posto. –

1

Si modifica l'elenco con la dichiarazione - L[a][b] = L[a][b] + L[a][b] ad es. -

L = [[1, 2, 3], [4, 5, 6], [3, 4, 6]] 

L[0][0] = 1 inizialmente Poi si modifica come L [0] [0] = 2

L = [[2, 2, 3], [4, 5, 6], [3, 4, 6]] 

Nel prossimo ciclo si cerca indice per 2, che è 0,0 ora, perché si lista modificata L. Ho provato a stampare L insieme a, b nell'esempio.Risultato spiega il comportamento -

0 0 
[[1, 2, 3], [4, 5, 6], [3, 4, 6]] 
0 0 
[[2, 2, 3], [4, 5, 6], [3, 4, 6]] 
0 2 
[[4, 2, 3], [4, 5, 6], [3, 4, 6]] 
1 0 
[[4, 2, 6], [4, 5, 6], [3, 4, 6]] 
1 1 
[[4, 2, 6], [8, 5, 6], [3, 4, 6]] 
1 2 
[[4, 2, 6], [8, 10, 6], [3, 4, 6]] 
2 0 
[[4, 2, 6], [8, 10, 12], [3, 4, 6]] 
2 1 
[[4, 2, 6], [8, 10, 12], [6, 4, 6]] 
2 0 
[[4, 2, 6], [8, 10, 12], [6, 8, 6]] 
+0

Grazie per la spiegazione –

0

Credo che il seguente pezzo di codice potrebbe essere migliore for x in L: #iterating sopra la lista orig per y in x: #iterating oltre l'elenco interno [x] [y] = [x] [y] + [x] [y]

0

Se ti ostini a usare il secondo metodo, allora avete bisogno di memorizzare il risultati in una variabile temporanea:

L = [[1, 2, 3], [4, 5, 6], [3, 4, 6]] 
M = [[0 for y in range(3)] for x in range(3)] 
for x in L: 
    a = L.index(x) 
    for y in L[a]: 
     b = L[a].index(y) 
     M[a][b] = L[a][b] + L[a][b] 
L = M 
print L 

uscita:

[[2, 4, 6], [8, 10, 12], [6, 8, 12]] 
Problemi correlati