2016-10-18 31 views
0

我有兩個列表,我想刪除匹配的單詞並保持不同。 這裏是代碼:在兩個列表中發現不同的單詞

def check_synonym(text): 
    tokens=regexp_tokenize(text, r'[،؟!.؛\s+]\s*', gaps=True) 
    based_text= ' '.join(cursor.execute('SELECT request FROM Male_Conversation_Engine WHERE request REGEXP?',[tokens[0]]).fetchone()) 
    based_tokens=regexp_tokenize(str(based_text), r'[،؟!.؛\s+]\s*', gaps=True) 
    for w1 in based_tokens: 
     for w2 in tokens: 
      if w1 == w2: 
       based_tokens.remove(w1),tokens.remove(w2)  
return list 

如果兩個名單是 「在阿拉伯語中」:

tokens = ['هذا','الجهاز','الجميل'] 
based_tokens = ['هذا','الجهاز','جيد'] 

輸出應該是:

tokens = ['الجميل'] 
based_tokens = ['جيد'] 

實際輸出:

tokens = ['الجهاز','جميل'] 
based_tokens = ['الجهاز','جيد'] 

旁邊只有德引用第一個元素'هذا'並返回列表的其餘部分。

(使用python3)

+0

的可能的複製[Python中,計算列表差異(http://stackoverflow.com/questions/6486450/python-compute-list-difference) – xbonez

回答

0

您可以使用組和列表內涵結合

s1 = set(tokens) 
s2 = set(based_tokens) 

tokens = [t for t in tokens if t not in s2] 
based_tokes = [t for t in based_tokens if t not in s1] 

我使用集的唯一原因是因爲大型列表它快得多檢查與集的隸屬。

+1

一旦你將它們轉換爲'set',你也可以做's1.difference(s2)' – xbonez

+0

@xbonez我不喜歡這個問題的解決方案,因爲第二個列表可能是五個相同的東西,不會出現在第一個列表中。 –

+0

@xbonez它也殺死列表的順序,如果這很重要 –

0
set1=set(tokens) 
    set2=set(based_tokens) 

    tokens = set1-set2 
    based_tokens = set2-set1 
相關問題