2012-07-31 12 views
10

Supponiamo che io avevo una listaC'è un modo per utilizzare due se le condizioni in list comprehension in pitone

my_list = ['91 9925479326','18002561245','All the best','good'] 

Ora voglio ignorare le stringhe nel elenco che inizia con 91 e 18 come qui di seguito

result = [] 
for i in my_list: 
    if not '91' in i: 
     if not '18' in i: 
     result.append(i) 

Quindi, qui voglio ottenere questo risultato con la comprensione delle liste. Esiste comunque la possibilità di scrivere due se le condizioni nella lista sono ridotte?

Qualcuno può per favore fatemelo sapere come fare in precedenza con list comprehension

Grazie in anticipo ............

+0

@jamylak: avevo preso come esempio che comunque grazie per l'editing. –

+5

Attenzione che i test controllano se '91' e' 18' sono presenti in qualsiasi posizione della stringa. Dovresti usare 'str.startswith' invece: http://docs.python.org/library/stdtypes.html#str.starts con –

risposta

14
[i for i in my_list if '91' not in i and '18' not in i] 

Nota non si dovrebbe usare list come nome di variabile, ombreggia la funzione integrata.

+1

(+1) per una risposta corretta e per cambiare' not '91' in i' su "91" non in i ". – mgilson

+0

Questa risposta non è così concisa e pulita non appena si hanno cinque di dieci anziché due valori da controllare. –

+0

Possiamo fare lo stesso con la funzione startwith perché a volte la lista è composta da stringhe che iniziano con 91 e alcune volte iniziano con 18, qualunque sia la stringa che inizia con 91 o 18 dovrebbe essere ignorata dall'elenco. In pratica le stringhe qui sono i numeri di telefono 91 9885564213 e 1800 3236 2365 –

1

È possibile "fondere" entrambe le condizioni:

if ((not '91' in i) and (not '18' in i)) 
+3

O semplificare l'uso della [Legge di DeMorgan] (http://en.wikipedia.org/wiki/De_Morgan%27s_laws):' in caso contrario ('91' in i o '18' in i) – Blckknght

7

Se si dispone di più di due valori (91 e 18) o sono prodotti in modo dinamico è meglio usare questa costruzione:

[i for i in my_list if not i.startswith(('91', '18'))] 

O se si vuole verificare se 91 e 18 sono nelle corde (non solo in principio), utilizzare in invece di startswith:

01.235.
[i for i in my_list if all(x not in i for x in ['91', '18'])] 

Esempio di utilizzo:

>>> my_list = ['91 9925479326','18002561245','All the best','good'] 
>>> [i for i in my_list if all(not i.startswith(x) for x in ['91', '18'])] 
['All the best', 'good'] 
>>> 
+1

preferisco: '[i for i in my_list se non ne esiste (i.startswith (x) per x in ['91', '18'])] 'ma credo che sia una preferenza personale – jamylak

+1

' .startswith' accetta anche una tupla di stringhe, quindi può essere abbreviata in '[i for i in my_list if not i.startswith (('91', '18'))]' . – MRAB

+0

@MRAB: Grazie per il suggerimento perfetto! Ho aggiornato la risposta e ho aggiunto la tua variante. Grazie mille –

Problemi correlati