Sono un po 'perplesso dalla funzione python (2.7) list.remove
. Nel documentation of remove si dice: "Rimuovi il primo elemento dall'elenco il cui valore è x. È un errore se non esiste tale elemento."Rimozione di un elemento da un elenco python, come vengono confrontati gli elementi (ad esempio array numpy)?
Quindi, credo che qui valore significa che il confronto si basa su uguaglianza (vale a dire ==
) e non identità (vale a dire is
). Tuttavia, qualcuno può spiegarmi il seguente comportamento. A quanto pare, entrambi i confronti sono usati, ma in un modo piuttosto strano:
import numpy as np
x = np.array([1,2,3])
mylist = [x, 42, 'test', x] # list containing the numpy array twice
print mylist
Ciò, naturalmente, di stampa:
[array([1, 2, 3]), 42, 'test', array([1, 2, 3])]
Fin qui tutto bene. Ma stranamente il seguente codice non esegue:
mylist.remove(x)
print mylist
dando
[42, 'test', array([1, 2, 3])]
mi aspetterei a gettare un errore perché le matrici NumPy non restituiscono una dichiarazione booleana, ma una matrice booleana. Ad esempio, x == x
restituisce array([ True, True, True], dtype=bool)
. Tuttavia, la nostra rimozione funziona felicemente. Tuttavia, chiamando la stessa dichiarazione ancora una volta produce il comportamento previsto:
mylist.remove(x)
getta un
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-3-835a19b5f6a9> in <module>()
----> 1 mylist.remove(x)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Che cosa sta succedendo?