2016-04-19 19 views
5

Ho un programma che sto cercando attraverso e con questa sezioneindicizzazione logico con le liste

temp = [1,2,3,4,5,6] 
temp[temp!=1]=0 
print temp 

Che se run dà il risultato:

[1, 0, 3, 4, 5, 6] 

Ho bisogno di aiuto per capire cosa sta succedendo in questo codice che porta a questo risultato.

risposta

3

Come Già spiegato che stai impostando il secondo elemento usando il risultato del confronto con un elenco che restituisce True/1 come bool is a subclass of int. Si dispone di un non elenco una matrice NumPy quindi è necessario scorrere su di esso se si vuole cambiare, che si può fare con la comprensione lista usando se/ELS e logica:

temp = [1,2,3,4,5,6] 
temp[:] = [0 if ele != 1 else ele for ele in temp ] 

che vi darà:

[1, 0, 0, 0, 0, 0] 

o utilizzando un'espressione generatore:

temp[:] = (0 if ele != 1 else ele for ele in temp) 
7

temp nel tuo esempio è un list, che chiaramente non è uguale a 1. Quindi l'espressione

temp[temp != 1] = 0 

è in realtà

temp[True] = 0 # or, since booleans are also integers in CPython 
temp[1] = 0 

Convertire temp a un array NumPy per ottenere il comportamento di trasmissione ti serve

>>> import numpy as np 
>>> temp = np.array([1,2,3,4,5,6]) 
>>> temp[temp != 1] = 0 
>>> temp 
array([1, 0, 0, 0, 0, 0]) 
3

Se NumPy non è un'opzione, utilizzare al è la comprensione per costruire una nuova lista.

>>> temp = [1,2,3,4,5,6] 
>>> [int(x == 1) for x in temp] 
[1, 0, 0, 0, 0, 0]