2012-04-11 22 views
1

我有以下列表:Python列表路口 - 正則表達式匹配

我想比較列表1和List2由於第一名稱匹配返回TRUE。我知道如果全名在list2中可用,我可以通過使用set交集來完成這項工作..但事實並非如此。有沒有一套交叉口的正則表達式匹配的版本

編輯:是對上面的例子的結果應該是一個真正的 如果我有一個項目list3

list3 = ['jack','jennifer'] 
list1-list2 : TRUE 
list2-list3 : FALSE 

EDIT2:我想我是不是很清楚我的原來的帖子。在列表2或項目list3我能有名字的組合和全名

list4 = ['john mayer', 'jennifer'] 
list1-list4 : TRUE 
+0

我添加到我的答案爲您的list4情況的結尾。 – 2012-04-11 04:47:56

+0

您能否完成以下英文句子:「結果應該是'True'當且僅當____,否則'False' – 2012-04-11 05:11:06

+0

當且僅當列表2的成員是與成員的正則表達式匹配時,結果應爲True list1,否則爲False – nitin 2012-04-11 06:17:55

回答

1
def first_name_is_in(first_names, full_names): 
    for name in first_names: 
     for full_name in full_names: 
      if full_name.startswith("%s " % (name,)): 
       return True 
    return False 
+0

@nitin,例如:''elizabeth taylor'.startwith('eli')'將返回'True' – 2012-04-12 06:38:00

+0

我編輯了我的答案以包含尾部空格 – MattoTodd 2012-04-12 16:46:44

+0

現在它'伊麗莎白泰勒'.startswith('伊麗莎白泰勒')失敗。這就是爲什麼其他答案在這裏顯得更加複雜。他們正確處理這兩種情況 – 2012-04-12 23:59:18

0
full_names = ['john mayer', 'elizabeth taylor', 'steven barber','jennifer richards'] 
first_names = ['john','jennifer'] 

all((any(full.split()[0]==first for full in full_names) for first in first_names)) 
0

由於@gnibbler建議最好是做一個設置,所以我已經改變了我的使用的。

>>> first_names = {name.split()[0] for name in list1} 
>>> all(x in first_names for x in list2) 
True 
1

你可以讓一組firstnames從list1這樣

>>> {x.split()[0] for x in list1} 
set(['john', 'jennifer', 'elizabeth', 'steven']) 

你可以這樣做

>>> list2 = ['john','jennifer'] 
>>> set(list2).difference(x.split()[0] for x in list1) 
set([])  # ie False 
>>> list3 = ['jack','jennifer'] 
>>> set(list3).difference(x.split()[0] for x in list1) 
set(['jack']) # ie True 

各種設置操作。如果你真的需要的bool ...

>>> bool(set(list2).difference(x.split()[0] for x in list1)) 
False 
>>> bool(set(list3).difference(x.split()[0] for x in list1)) 
True 

或逆...

>>> bool(not set(list2).difference(x.split()[0] for x in list1)) 
True 
>>> bool(not set(list3).difference(x.split()[0] for x in list1)) 
False 

對於新list4測試用例

>>> list4 = ['john mayer', 'jennifer'] 
>>> {x.split()[0] for x in list1}.union(list1) > set(list2) 
True 
>>> {x.split()[0] for x in list1}.union(list1) > set(list3) 
False 
>>> {x.split()[0] for x in list2}.union(list2) > set(list3) 
False 
>>> {x.split()[0] for x in list1}.union(list1) > set(list4) 
True 
1
>>> set(list2).issubset(ele.split(' ')[0] for ele in list1) 
True 

我刪除[],因爲我曾在我原來的職位,這要歸功於jamylak提出的觀點。

+0

的編輯2 +1好的解決方案,但爲什麼不移除'[',']',所以你不會創建列表理解? – jamylak 2012-04-11 03:53:04

+0

是的,[。]在這裏沒有必要,所以我刪除了它們。感謝您指出了這一點。 – Akavall 2012-04-11 04:01:38