2014-01-30 27 views
1

我有兩個子列表的列表,我想檢查兩個列表中的子列表中的一個項目是否與另一個列表匹配?如何檢查兩個使用正則表達式的子列表之間是否存在任何匹配?

例如,我想看看,如果在索引0任何子表索引0

lsta = [['aaa','bbb','ccc'],['xxx','bbb','ccc'],['eee','bbb','ccc']] 
lstb = [['aaa','b','2'],['xxx','ddd','efe']] 

什麼是返回LSTA所有項目以最快的方式在其他列表中出現,如果任何項目在索引1在lstb的索引1處出現? :

Desired_List = [['aaa','bbb','ccc'],['xxx','bbb','ccc']] 

For-Loops對我的大名單來說太慢了,所以我想知道是否有更快的方法?

這基本上是我想要完成的任務,但速度更快

Desired_List = [] 
for x in lsta: 
    for y in lstb: 
     if re.search(x[0],str(y)): 
      Desired_List.append(x) 

或是否有任何其他的方式來完成這個任務?也許是一個列表理解?

也或許,但不知道什麼快:

Desired_List = filter(lambda x: re.search(str(x[0]),str(lstb)),lsta) 
+0

您可以發佈您的for循環? 請注意,這是一個n^2算法(lsta中的每個元素都需要與lstb的每個元素進行比較),但如果您正在執行大量的執行操作,則可以使用更好的數據結構加速它。 – jkinkead

+0

我怎麼能改善這裏的數據結構? – Chris

回答

0

您應該能夠通過建立一個字典出的lstb加快這:

dictb = {el[0]: el for el in lstb} 
Desired_List = [el for el in lsta if el[0] in dictb] 
2

做的一個set出現在lstb的子列表的索引0處的項目,然後使用該集合來快速確定匹配的項目lsta

b_set = set(sublist[0] for sublist in lstb) 
desiredlist = [sublist for sublist in lsta if sublist[0] in b_set] 

請注意,您for循環的解決方案是錯誤的:

>>> lsta = [[', ', '', '']] 
>>> lstb = [['a', 'b', 'c']] 
>>> Desired_List = [] 
>>> for x in lsta: 
...  for y in lstb: 
...   if re.search(x[0],str(y)): 
...    Desired_List.append(x) 
... 
>>> Desired_List 
[[', ', '', '']] 
+0

@Chris:已更正並經過測試。 – user2357112

相關問題