2014-12-13 15 views
5

Ho una lista 2 dimensionale:Sostituzione ogni 2 ° elemento della lista

[[5, 80, 2, 57, 5, 97], [2, 78, 2, 56, 6, 62], [5, 34, 3, 54, 6, 5, 2, 58, 5, 61, 5, 16]] 

In cui ho bisogno di cambiare ogni secondo elemento a 0, a partire dal primo. Così dovrebbe assomigliare a questo:

[[0, 80, 0, 57, 0, 97], [0, 78, 0, 56, 0, 62], [0, 34, 0, 54, 0, 5, 0, 58, 0, 61, 0, 16]] 

Algorithm che uso:

for i in tempL: 
    for j, item in enumerate(i): 
     if i.index(item) % 2 == 0: 
      print('change, index:'), 
      print(i.index(item)) 
      i[j] = 0 
     else: 
      print('not change, index:'), 
      print(i.index(item)) 

Ma ciò che ottengo è questo:

change, index: 0 
not change, index: 1 
change, index: 2 
not change, index: 3 
change, index: 4 
not change, index: 5 
change, index: 0 
not change, index: 1 
change, index: 2 
not change, index: 3 
change, index: 4 
not change, index: 5 
change, index: 0 
not change, index: 1 
change, index: 2 
not change, index: 3 
change, index: 4 
not change, index: 5 
change, index: 6 
not change, index: 7 
not change, index: 5 
not change, index: 9 
not change, index: 5 
not change, index: 11 
[[0, 80, 0, 57, 0, 97], [0, 78, 0, 56, 0, 62], [0, 34, 0, 54, 0, 5, 0, 58, 5, 61, 5, 16]] 

Alcuni elementi non sono cambiati, ed è perché (I aggiunto indice di stampa per vedere che) pensa che l'indice di quegli elementi sia 7 e 9 per qualche ragione. Che cosa può essere, perché sto cercando un errore per così tanto tempo ancora non riesco a trovare ..

Ho controllato, non ci sono spazi extra o nulla nella lista.

+0

Perché stai utilizzando 'i.index'? Non intendi 'j'? – kojiro

risposta

2

Penso che il vostro algoritmo è corretto. Hai appena fatto un errore logico. Usando i.index, stai cercando l'elenco interno per quel valore ogni volta. Non è solo costoso, è sensibile ai valori duplicati.

for i in tempL: 
    for j, item in enumerate(i): 
     # if i.index(item) % 2 == 0: oops 
     if j % 2 == 0: 
      print('change, index:'), 
      print(i.index(item)) 
      i[j] = 0 
     else: 
      print('not change, index:'), 
      print(i.index(item)) 
+0

Sì! Grazie. – estranged

1

come un modo più divinatorio Si può semplicemente utilizzare una lista di comprensione:

>>> l=[[5, 80, 2, 57, 5, 97], [2, 78, 2, 56, 6, 62], [5, 34, 3, 54, 6, 5, 2, 58, 5, 61, 5, 16]] 
>>> l=[[t if k%2 else 0 for k,t in enumerate(i)] for i in l] 
>>> l 
[[0, 80, 0, 57, 0, 97], [0, 78, 0, 56, 0, 62], [0, 34, 0, 54, 0, 5, 0, 58, 0, 61, 0, 16]] 
+0

Quindi cambio 'l' con il mio nome di lista? Non fa nulla per me, anche se il tuo codice sembra buono. – estranged

+0

@estranged Non vedo alcun motivo per cui non riesco a lavorare con il codice, nota che la mia risposta è in shell è necessario stamparla se si scrive il codice in un editor di testo !!! – Kasramvd

+0

Oh sì, ho bisogno di assegnare una lista a questo! Questo è molto carino. – estranged

3

Bene, questo compito dovrebbe essere ovvio. Usa l'assegnazione delle fette! Devi assegnare una serie di zeri, che sono metà lunghezza. Per crearne uno, basta moltiplicare singolo array elemento con valore:

for l in tempL: 
    l[::2] = [0] * ((len(l)+1)/2) 

Oppure utilizzare repeat da itertools (purtroppo questo è due volte più lento per piccoli array):

from itertools import repeat 

for l in tempL: 
    l[::2] = repeat(0,(len(l)+1)/2) 
+0

Ho provato a tagliare, ma non ho capito come usarlo correttamente. Inoltre non capisco affatto la seconda metà della tua equazione. – estranged

+0

Ero curioso e ho fatto alcuni test di temporizzazione, il primo metodo in questa risposta è un ordine di grandezza (più) più veloce della comprensione - e * scala * meglio con le sottoliste più lunghe. @estranged - l'assegnazione di slice * advanced * sul lato sinistro richiede un iterabile sul lato destro.Il lato destro crea un elenco di zeri con abbastanza elementi per l'assegnazione. @Arpegius - Non penso che sia necessario il '' '+ 1''' per determinare il numero di zeri richiesti. – wwii

+0

@wwii Sì, hai bisogno di '+ 1' come se ci fosse un numero dispari di elementi di cui hai bisogno di un altro mezzo. Se inizi dal secondo come '[1 :: 2]', allora sarà senza '+ 1'. – Arpegius

0

Giusto per aggiungere i miei due centesimi:

Utilizzando Modulo operatore

mylist= [[5, 80, 2, 57, 5, 97], [2, 78, 2, 56, 6, 62], [5, 34, 3, 54, 6, 5, 2, 58, 5, 61, 5, 16]] 

for i,n in enumerate(mylist): 
    for j,m in enumerate(n): 
     if j % 2 == 0: 
      mylist[i][j] = 0 

print mylist 

uscita:

[[0, 80, 0, 57, 0, 97], [0, 78, 0, 56, 0, 62], [0, 34, 0, 54, 0, 5, 0, 58, 0, 61, 0, 16]] 
Problemi correlati