2009-05-05 3 views
7

Ich versuche zu sehen, ob ich diesen Code mit List Comprehensions besser machen kann.
Lassen Sie uns sagen, dass ich die folgenden Listen haben:Listenbeschreibungen und Bedingungen?

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

Ich möchte im Grunde alle Elemente hinzuzufügen, die in der regex_list in eine andere Liste Streichhölzer nicht haben.

z. ==>

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

Wie kann ich das mit List Comprehensions tun? Ist es überhaupt möglich?

+0

-1: lambdas. Benutze einfach den Regex selbst, verschwende keine Zeit damit, einen perfekt guten Regex in einer Funktion zu verpacken. –

Antwort

17

Sicher, ich denke, das es

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

EDIT tun soll: bei genauerem Hinsehen, merke ich, dass Ihr Beispielcode fügt tatsächlich auf die neue Liste jede Saite in a_list, die nicht alle überein die Regexes - und was mehr ist, es fügt jeden String einmal für jeden Regex, der nicht übereinstimmt. Meine Liste Verständnis tut, was ich denke, dass Sie gemeint, die nur eine Kopie jeder Zeichenfolge hinzufügen, die keine der Regexe passt.

+0

Nicht das gleiche Verhalten wie der Code, den er gab, da "each" nie mehr als einmal wie im Beispiel angehängt wird. Aber ich glaube, das ist es, was er eigentlich erreichen wollte. – bayer

+0

Danke das ist perfekt. – UberJumper

+0

Noch eine Frage, wenn ich sagen würde, a_list durch eine Funktion ersetzen, die eine Liste zurückgibt. Wird es nur einmal angerufen? Oder wird es bei jeder Iteration aufgerufen? z.B. def returnalist(): return [ 'klsdfj', 'kldffjsdkl', 'Hallo', 'somethinghats'] und tat: newlist = [s für s in returnalist(), wenn keine (r (n) für r in regex_list)] Würde Returnalist ständig aufgerufen werden? – UberJumper

0

würde ich Ihren Code arbeiten unten zu diesem:

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

Dann haben Sie zwei Möglichkeiten:

  1. Filter

    newlist = filter(regex_func, a_list)

  2. Liste Comprehensions

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