2009-05-05 51 views
7

我想看看如果我可以使用列表解析更好地使這段代碼更好。
比方說,我有以下列表:列表理解和條件?

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

我基本上要添加的所有沒有在regex_list任何匹配到另一個列表中的元素。

例如==>

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

我該如何使用列表解析來做到這一點?它甚至有可能嗎?

+0

-1:lambdas。只要使用正則表達式本身,不要浪費時間在函數中包裝完美的正則表達式。 – 2009-05-05 19:31:43

回答

17

當然,我覺得這個應該這樣做

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

編輯:仔細觀察,我注意到你的示例代碼實際上是增加了新的列表中a_list每個字符串不匹配所有正則表達式 - 更重要的是,它爲每個不匹配的正則表達式添加每個字符串一次。我的列表理解做我認爲你的意思,這是隻添加每個字符串的一個副本,不匹配正則表達式的任何

+0

與他給出的代碼行爲不同,因爲「each」永遠不會像示例中那樣被多次添加。但是,我相信這是他真正想要達到的目標。 – bayer 2009-05-05 19:09:12

0

我想以你的代碼到這一點:

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

這時你有兩種選擇:

  1. 過濾

    newlist = filter(regex_func, a_list)

  2. 列表理解

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