2011-12-28 46 views
0

我有一個我想在單個字符串上運行的正則表達式列表。我不在乎哪個表達式匹配,我只是想要他們的結果(re.Match對象)。是否可以將此映射/過濾器代碼轉換爲列表理解?

當然用for循環很容易,但我想要更pythonic的東西。這是我現在得到的:

all_matches = map(lambda x: x.match(domain), 
        (first_re, second_re, third_re)) 
matches = [m for m in all_matches if m] 

雖然我覺得在我的皮膚下,它應該可以作爲單一的理解。它應該是什麼樣子?如果可能的話?

此外,更普遍的是 - 列表解析等價於映射/過濾器還是它們只具有m/f能力的子集?

+1

map/filter可以完成列表解析功能的一部分。 – 2011-12-28 15:45:45

回答

3

這可以寫成一個簡單的列表理解。然而,r.match(domain)將不得不兩次評估:

matches = [r.match(domain) for r in (first_re, second_re, third_re) if r.match(domain)] 

否則你就必須寫一個雙列表理解:

matches = [a for a in (r.match(domain) for r in (first_re, second_re, third_re)) if a] 
+0

雙列表理解 - 爲什麼我沒有想到:)謝謝! – GDR 2011-12-30 21:01:23

1

在一般情況下,過濾器/圖可以寫成一個列表理解(關於這一點見documentation)。在這種情況下,您可以編寫matches = [x.match(domain) for x in (first_re, second_re, third_re) if x.match(domain)]

相關問題