2015-08-25 140 views
4

我有兩個不同長度的列表。python中匹配兩個列表

list1=['T','P','M','M','A','R','k','M','G','C'] 
list2=['T','P','M','M','A','R','k','S','G','C','N'] 

通過比較list1list2:結果必須是:

new_list1=['T','P','M','M','A','R','k','mis','M', 'G','C','mis']  
new_list2=['T','P','M','M','A','R','k','S', 'mis','G','C','N']  

的方法是通過匹配兩個列表中的元素與重複。如果在同一位置存在不匹配的元素。例如在list1中有三份M,在list2中有兩份。結果必須指在此位置丟失list2Mlist1中缺少字符S,結果也必須指定爲缺失。

任何人都可以幫助我嗎?

+9

請告訴我們,試圖做到這一點,並解釋它是如何工作不適合你,你所編寫的代碼 – scytale

+0

請至少提供一個確切的描述您需要處理和去往的不匹配類型。這個問題的一般情況是[NP-complete](https://en.wikipedia.org/wiki/Closest_string)。如果您可以將其減少到*編輯距離*,請從[Hirschberg算法](https://en.wikipedia.org/wiki/Hirschberg's_algorithm)開始。 – dhke

+2

你必須定義哪個列表是主要的。猜猜你需要從輸入中得到什麼list1 = ['a','b'] list2 = ['b','a'] – knagaev

回答

2

假設 「錯誤」 是一個特殊值:

from itertools import zip_longest 

def create_matchs(alst, blst, mis="mis"): 
    for a, b in zip_longest(alst, blst, fillvalue=mis): 
     if a == b or mis in (a, b): 
      yield a, b 
     else: 
      yield mis, b 
      yield a, mis 

list1 = ['T','P','M','M','A','R','k','M','G','C'] 
list2 = ['T','P','M','M','A','R','k','S','G','C','N'] 
new_list1, new_list2 = zip(*create_matchs(list1, list2)) 
print(new_list1) 
print(new_list2) 
1

你也可以嘗試一下。其簡單:

list1=['T','P','M','M','A','R','k','M','G','C'] 
list2 =['T','P','M','M','A','R','k','S','G','C','N'] 

if len(list1) > len(list2): 
     diff = len(list1) - len(list2) 
     for i in range(0, diff): 
       list2.append('mis') 
else: 
     diff = len(list2) - len(list1) 
     for i in range(0, diff): 
       list1.append('mis') 

new_list1 = [] 
new_list2 = [] 
for i in zip(list1,list2): 
     if i[0] == i[1]: 
       new_list1.append(i[0]) 
       new_list2.append(i[1]) 
     elif i[0] == 'mis' or i[1] == 'mis': 
       new_list1.append(i[0]) 
       new_list2.append(i[1]) 
     else: 
       new_list1.append(i[0]) 
       new_list2.append('mis') 

       new_list1.append('mis') 
       new_list2.append(i[1]) 

print new_list1 
print new_list2 

輸出:

['T', 'P', 'M', 'M', 'A', 'R', 'k', 'M', 'mis', 'G', 'C', 'mis'] 
['T', 'P', 'M', 'M', 'A', 'R', 'k', 'mis', 'S', 'G', 'C', 'N']