2010-02-02 17 views

risposta

18

utilizzare un elenco di comprensione:

[x for x in a if x != [1, 1]] 
+2

So scrivere 'WHERE' qui è allettante, Ignacio, per analogia con SQL ... ma non funziona! Devi scriverlo 'se', come ho fatto nella mia risposta. –

+0

@Alex: Argh, sì, giusto, corretto. –

28

Se si desidera modificare l'elenco sul posto,

a[:] = [x for x in a if x != [1, 1]] 
+0

Perché impostare 'a [:]' invece di solo 'a'? – Raj

+1

@Raj: 'a = [1]; b = a; a = [2]; b == [1] '; 'a = [1]; b = a; a [:] = [2]; b == [2] '. – ephemient

+2

@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

3
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) 
+0

Dato cosa già 'list.remove' fa, probabilmente chiamerei questa funzione' removeall'. – ephemient

+0

..... Ok:) ..... –

5
def remAll(L, item): 
    answer = [] 
    for i in L: 
     if i!=item: 
      answer.append(i) 
    return answer 
+0

pensato che sembra più lungo di altri, ma il codice è in realtà pulito, leggibile ed efficiente. –

7

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) 
+0

Cosa c'è di sbagliato con 'filter ([1,1] .__ ne__, a)'? – tzot

+0

@ ΤΖΩΤΖΙΟΥ Che funziona per 'list', ma' __ne__' non esiste come metodo su 'int' o altri tipi in Python 2.x. Ciò è corretto in Python 3.x, ma per coerenza ... – ephemient

1
filter([1,1].__ne__,a) 
+0

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

0

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 
4

Ecco un'alternativa più facile la risposta di Alex Martelli:

a = [x for x in a if x != [1,1]] 
+0

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

Problemi correlati