Diciamo che ho una lista a
:Come posso rimuovere tutte le istanze di un elemento da un elenco in Python?
a = [[1, 1], [2, 2], [1, 1], [3, 3], [1, 1]]
C'è una funzione che rimuove tutte le istanze di [1, 1]
?
Diciamo che ho una lista a
:Come posso rimuovere tutte le istanze di un elemento da un elenco in Python?
a = [[1, 1], [2, 2], [1, 1], [3, 3], [1, 1]]
C'è una funzione che rimuove tutte le istanze di [1, 1]
?
utilizzare un elenco di comprensione:
[x for x in a if x != [1, 1]]
Se si desidera modificare l'elenco sul posto,
a[:] = [x for x in a if x != [1, 1]]
Perché impostare 'a [:]' invece di solo 'a'? – Raj
@Raj: 'a = [1]; b = a; a = [2]; b == [1] '; 'a = [1]; b = a; a [:] = [2]; b == [2] '. – ephemient
@Raj 'a' non è una casella in cui inserisci gli oggetti: è un tag che leghi agli oggetti. 'a = ...' lega la tag name a un nuovo oggetto, ma 'a [:]' sostituisce tutti gli elementi della lista a cui 'a' è legato con il contenuto della nuova lista. – wizzwizz4
new_list = filter(lambda x: x != [1,1], a)
O come una funzione:
def remove_all(element, list):
return filter(lambda x: x != element, list)
a = remove([1,1],a)
Or più generale:
def remove_all(elements, list):
return filter(lambda x: x not in elements, list)
a = remove(([1,1],),a)
Dato cosa già 'list.remove' fa, probabilmente chiamerei questa funzione' removeall'. – ephemient
..... Ok:) ..... –
def remAll(L, item):
answer = []
for i in L:
if i!=item:
answer.append(i)
return answer
pensato che sembra più lungo di altri, ma il codice è in realtà pulito, leggibile ed efficiente. –
Google trova Delete all items in the list, che comprende gioielli come
from functools import partial
from operator import ne
a = filter(partial(ne, [1, 1]), a)
filter([1,1].__ne__,a)
Preferisco 'functools.partial (operator.ne, [1,1])', perché (almeno in Python 2.x) altri tipi (' int', per esempio) non tutti hanno '__ne__'. Questo sembra essere corretto in Python 3, tuttavia: tutti i tipi derivano da 'object', che ha' __ne__'. – ephemient
puro pitone nessuna versione moduli, o nessuna versione lista comp (più semplice da capire?)
>>> x = [1, 1, 1, 1, 1, 1, 2, 3, 2]
>>> for item in xrange(x.count(1)):
... x.remove(1)
...
>>>
>>> x
[2, 3, 2]
può essere trasformato in un def abbastanza facilmente anche
def removeThis(li,this):
for item in xrange(li.count(this)):
li.remove(this)
return li
Ecco un'alternativa più facile la risposta di Alex Martelli:
a = [x for x in a if x != [1,1]]
Ciò si comporta in modo diverso: imposterà il valore della variabile ma non modificherà l'oggetto. Sembra funzionare, ma non modifica l'elenco - piuttosto lo sostituisce. Qualunque cosa stia usando la vecchia lista non riceverà un aggiornamento. – wizzwizz4
So scrivere 'WHERE' qui è allettante, Ignacio, per analogia con SQL ... ma non funziona! Devi scriverlo 'se', come ho fatto nella mia risposta. –
@Alex: Argh, sì, giusto, corretto. –