2009-05-05 10 views
7

Estoy tratando de ver si puedo mejorar este código usando listas de comprensión.
que permite decir que tengo las siguientes listas:¿Enumera comprensiones y condiciones?

a_list = [ 
     'HELLO', 
     'FOO', 
     'FO1BAR', 
     'ROOBAR', 
     'SHOEBAR' 
     ] 

regex_list = [lambda x: re.search(r'FOO', x, re.IGNORECASE), 
       lambda x: re.search(r'RO', x, re.IGNORECASE)] 

básicamente quiero añadir todos los elementos que no tienen ninguna coincidencia en la regex_list en otra lista.

E.g. ==>

newlist = [] 
for each in a_list: 
    for regex in regex_list: 
     if(regex(each) == None): 
      newlist.append(each) 

¿Cómo puedo hacer esto usando la lista de comprensiones? ¿Es posible?

+0

-1: lambdas. Solo usa la expresión regular, no pierdas el tiempo envolviendo una expresión regular perfectamente buena en una función. –

Respuesta

17

Claro, creo que esto debería hacerlo

newlist = [s for s in a_list if not any(r(s) for r in regex_list)] 

EDITAR: en una inspección más cercana, noto que su código de ejemplo se agrega en realidad a la nueva lista de cada cadena en a_list que no coincide con todas las expresiones regulares, y lo que es más, agrega cada cadena una vez para cada expresión regular que no coincide. Mi lista de comprensión hace lo que creo que quiso decir, que es agregar solo una copia de cada cadena que no concuerde con de las expresiones regulares.

+0

No tiene el mismo comportamiento que el código que dio ya que "cada" nunca se agregará más de una vez como en el ejemplo. Sin embargo, creo que esto es lo que realmente quería lograr. – bayer

+0

Gracias, eso es perfecto. – UberJumper

+0

Una pregunta más, si tuviera que decir reemplazar una lista por una función que devuelva una lista. ¿Solo se llamará una vez? ¿O será llamado en cada iteración? p. returnalist def(): retorno [ 'klsdfj', 'kldffjsdkl', 'hola', 'somethinghats'] y lo hizo: newList = [s para s en returnalist() si no cualquier (r (s) para r en regex_list)] ¿Se llamaría constantemente al reanalista? – UberJumper

0

me gustaría trabajar su código reduce a esto:

a_list = [ 
      'HELLO', 
      'FOO', 
      'FO1BAR', 
      'ROOBAR', 
      'SHOEBAR' 
      ] 
regex_func = lambda x: not re.search(r'(FOO|RO)', x, re.IGNORECASE)  

Entonces usted tiene dos opciones:

  1. Filtrar

    newlist = filter(regex_func, a_list)

  2. listas por comprensión

    newlist = [x for x in a_list if regex_func(x)]

Cuestiones relacionadas