2010-08-05 14 views
5

Oppure come if-statement in una lista modificata.Generatore in istruzione if in python

Ho letto StackOverflow per un po '(grazie a tutti). Lo adoro. Ho anche visto che puoi pubblicare una domanda e rispondere da solo. Scusa se duplo, ma non ho trovato questa risposta particolare su StackOverflow.


  • Come si fa a verificare se un elemento è in una lista, ma modificarlo nello stesso tempo?

Il mio problema:

myList = ["Foo", "Bar"] 
if "foo" in myList: 
    print "found!" 

Come io non conosco il caso del elemento della lista voglio mettere a confronto con la lista minuscole. La risposta ovvia ma brutta sarebbe:

myList = ["Foo", "Bar"] 
lowerList = [] 

for item in myList: 
    lowerList.append(item.lower()) 

if "foo" in lowerList: 
    print "found!" 

Posso fare meglio?

+4

Punto minore: mentre si può usare 'lista' come nome di variabile, probabilmente non si dovrebbe fare così ha il nome del tipo built-in. –

+0

Bel colpo Peter: in realtà penso che sia un punto da moderato a importante. –

+0

cambiato, grazie! –

risposta

8
if any(s.lower() == "foo" for s in list): print "found" 
+2

nota: any() è leggermente migliore della comprensione degli elenchi perché si arresta non appena viene trovato il primo elemento. Inoltre non creerà un elenco temporaneo usa e getta. –

+0

+1 per rispondere a Q come richiesto OP, usando un'espressione di generatore –

+0

Ho ragione se dico che la tua risposta e la mia sono le stesse? –

1

di lista:

mylist = ["Foo", "Bar"] 
lowerList = [item.lower() for item in mylist] 

allora si può fare qualcosa di simile if "foo" in lowerlist o bypassare la variabile temporanea interamente con if "foo" in [item.lower() for item in mylist]

0

ne dite:

theList = ["Foo", "Bar"] 
lowerCaseSet = set(x.lower for x in theList) 

if "foo" in lowerCaseSet: 
    print "found" 

BTW. non si dovrebbe chiamare la variabile list poiché questa parola è già utilizzata dal tipo list.

+0

Un buon punto per la denominazione –

1

Questo unisce i vantaggi di memoria di un generatore di espressione con i guadagni di velocità di rimuovere i duplicati:

if "foo" in (s.lower() for s in set(list)): print "found" 
+0

Perché stai facendo un set della lista? –

+0

Due motivi. Gli insiemi hanno un tempo di ricerca di O (1) rispetto a un elenco, che ha un tempo di ricerca su O (n). La generazione di un set rimuove anche eventuali duplicati dei dati iniziali. –

+0

Non stai cercando nulla nel set, lo stai semplicemente iterando. –

0

prega di non utilizzare lista come nome di variabile, qui è la versione che mette generatore alla variabile e dimostra , quella generazione si fermò dopo aver trovato la risposta e non esaurì il generatore:

list_to_search = ["Foo", "Bar"] 
lowergen = (item.lower() for item in list_to_search) 
if "foo" in lowergen: 
    print "found!" 
print next(lowergen), 'is next after it'