2009-05-05 3 views
7

J'essaie de voir si je peux améliorer ce code en utilisant la compréhension des listes.
Disons que je les listes suivantes:Compréhensions et conditions?

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)] 

Je veux essentiellement d'ajouter tous les éléments qui n'ont pas de matches de la regex_list dans une autre liste.

E.g. ==>

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

Comment puis-je faire compréhensions? Est-ce même possible?

+0

-1: lambdas. Utilisez simplement la regex elle-même, ne perdez pas de temps à envelopper une bonne regex dans une fonction. –

Répondre

17

Bien sûr, je pense que cela devrait le faire

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

EDIT: regardant de plus près, je remarque que votre code exemple ajoute en fait à la nouvelle liste chaque chaîne dans a_list qui ne correspond pas à tous les expressions rationnelles - et de plus, il ajoute chaque chaîne une fois pour chaque regex qu'il ne correspond pas. Ma compréhension de la liste fait ce que je pense que vous vouliez dire, qui est d'ajouter une seule copie de chaque chaîne qui ne correspond pas des expressions rationnelles.

+0

Pas le même comportement que le code qu'il a donné puisque "chacun" ne sera jamais ajouté plus d'une fois comme dans l'exemple. Cependant, je crois que c'est ce qu'il voulait réellement réaliser. – bayer

+0

Merci c'est parfait. – UberJumper

+0

Une question de plus, si je devais laisser dire remplacer une liste par une fonction qui renvoie une liste. Sera-t-il seulement appelé une fois? Ou sera-t-il appelé à chaque itération? par exemple. def returnalist(): retour [ 'klsdfj', 'kldffjsdkl', 'bonjour', 'somethinghats'] et a fait: newlist = [s pour s en returnalist() si pas (r (s) pour r dans regex_list)] Est-ce que returnalist serait appelé constamment? – UberJumper

0

Je travaillerais votre code à ceci:

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

Ensuite, vous avez deux options:

  1. Filtre

    newlist = filter(regex_func, a_list)

  2. Liste compréhensions

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

Questions connexes