2015-08-25 93 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']