2010-08-05 40 views
5

O cómo a instrucción if en una lista modificada.Generador en instrucción if en python

He estado leyendo StackOverflow por un tiempo (gracias a todos). Lo amo. También he visto que puedes publicar una pregunta y responderla tú mismo. Lo siento si duplico, pero no encontré esta respuesta en particular en StackOverflow.


  • ¿Cómo se verifica si un elemento se encuentra en una lista, sino modificarlo en el mismo tiempo?

Mi problema:

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

Como no sé el caso del elemento en la lista quiero comparar con la lista minúsculas. La respuesta obvia pero fea sería:

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

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

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

¿Lo puedo hacer mejor?

+4

Punto menor: si bien puede usar 'lista' como nombre de variable, probablemente no debería hacerlo como excesivo hadows el nombre del tipo incorporado. –

+0

Buena captura Peter: Creo que ese es un punto de moderado a importante. –

+0

cambiado, gracias! –

Respuesta

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

nota: any() es ligeramente mejor que la comprensión de la lista porque se detiene tan pronto como se encuentra el primer elemento. Además, no creará una lista temporal desechable. –

+0

+1 para responder Q como OP preguntó, utilizando una expresión de generador –

+0

¿Estoy en lo cierto si digo que su respuesta y la mía son las mismas? –

1

listas por comprensión:

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

entonces usted puede hacer algo como if "foo" in lowerlist o pasar por alto la variable temporal en su totalidad con if "foo" in [item.lower() for item in mylist]

0

¿Qué tal:

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

if "foo" in lowerCaseSet: 
    print "found" 

cierto. no debe llamar a su variable list ya que esta palabra ya está siendo utilizada por el tipo list.

+0

Buen punto para la nomenclatura –

1

Esto combina las ventajas de memoria de una expresión generador con las ganancias de velocidad de eliminación de duplicados:

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

¿Por qué estás haciendo un conjunto de la lista? –

+0

Dos razones. Los conjuntos tienen un tiempo de búsqueda de O (1) frente a una lista, que tiene un tiempo de búsqueda en O (n). Generar un conjunto también elimina cualquier duplicado de los datos iniciales. –

+0

No estás buscando nada en el conjunto, solo iteras sobre él. –

0

Por favor, no hacer la lista utilizar como nombre de la variable, aquí es la versión que pone generador de variable y demuestra , esa generación se detuvo después de encontrar la respuesta y no agotó el generador:

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' 
Cuestiones relacionadas