2016-02-26 17 views
0

我們有兩個列表,發現如果列表的列表中有從另一個列表中的項目

l=["a","b","c"] 
s=[["a","b","c"], 
["a","d","c"], 
["a-B1","b","c"], 
["a","e","c"], 
["a_2","c"], 
["a","d-2"], 
["a-3","b","c-1-1","d"]] 
print l 
print s 

現在,我嘗試看看如果s各2級列表中有模糊匹配任何在列表中的項目l

matches=list() 
matchlist2=list() 
print s2 
for i in range(len(s)): 
    matches.append([]) 
    for j in range(len(s[i])): 

     for x in l: 
      if s[i][j].find(x)>=0: 
       print s[i][j] 
       matches[i].append(True) 

       break 
     else: 
      matches[i].append(False) 


    matchlist2.append(all(x for x in matches[i])) 
print matches 
print matchlist2 

這給了我想要的東西。但我對它有如此多的循環感到不滿意。我也在和大熊貓一起工作,如果有大熊貓的解決方案,那將是很棒的。在熊貓中,只有兩列兩個數據框。

[[True, True, True], [True, False, True], [True, True, True], [True, False, True], [True, True], [True, False], [True, True, True, False]] 

第二個代碼檢查子列表中的所有項目是否匹配。

[True, False, True, False, True, False, False] 
+2

我相信你正在尋找http://www.codereview.stackexchange.com。我們在這裏的代碼是*不*工作。 – zondo

+1

在你的情況下,什麼被定義爲模糊匹配? – timgeb

+0

在@zondo說的之上,看看遞歸。它將減少循環層次併爲您提供多層次數組的更多功能。 – CalebB

回答

2

我更喜歡簡潔和可讀性此解決方案:

>>> [all(any(x.startswith(y) for y in l) for x in sub) for sub in s] 
[True, False, True, False, True, False, False] 
+0

謝謝,像這樣的一個更好, – Ananta

0

檢查每個項目是在參考名單:

[[e in l for e in sl] for sl in s] 

檢查是否所有項目都在引用列表:

[all(e in l for e in sl) for sl in s] 
+0

感謝@arhimedec,但是它檢查整個匹配而不是部分匹配 – Ananta

+0

是否想知道是否所有項目匹配...部分檢查?! –

1

您可以在幾行使用寫map,filter和lambda表達式:

matches = map(lambda b:[len(filter(lambda x:x in a,l))>0 for a in b],s) 

matchlist2 = [all(a) for a in matches] 

該表達式filter(lambda x:x in a,l)返回l中的字符串是s中字符串的一部分的所有元素。 len...>0然後用於驗證是否至少找到一個元素。然後使用最終的拉姆達(lambda b)獲得s中每個元素的truefalse值。

+0

謝謝哈科,很好的回答我仍然在努力使用這個「黑客」 – Ananta

相關問題