在Python中匹配两个列表

4

我有两个不同长度的列表。

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中有两个副本。结果必须指向在此位置上list2中缺失的M。字符Slist1中缺失,结果也必须分配给缺失项。
有人可以帮我吗?

9
请展示您编写的尝试实现此功能的代码,并解释为何它无法正常工作。 - scytale
请至少提供您需要处理的不匹配类型的确切描述,然后再从那里开始。这个问题的一般情况是NP完全。如果您可以将其缩小到编辑距离,请从Hirschberg算法开始。 - dhke
2
你必须定义哪个列表是主要的。猜猜你需要从输入列表1 = ['a','b']列表2 = ['b','a']中获取什么。 - knagaev
2个回答

2
假设“mis”是一个特殊的值:
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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接