遍历 python 3 个字符串列表并将每个项目与其他项目进行匹配,return 最大的匹配

Iterate through a python 3 list of string and match every item against the others and return the the largest match

我有一个 python 列表。在此列表中,我需要将每个项目与其他项目进行比较,并将较短的字符串替换为最长的字符串。

编辑:我有一个使用 Spacy 模块获得的人名列表及其实体提取。我得到一个列表,有时是全名,有时是部分名称。我想规范化这个列表,所以它总是全名(或文章中最长的名字)。这将帮助我确定文章中最多 prominent/mentioned 的人是谁。

small_example = ['David', 'David Stevens', 'Steve Martin' ]
small_example_outcome = [ 'David Stevens','David Stevens', 'Steve Martin'] 

完整示例:

person_list = [ 'Omarosa Manigault Newman', 'Manigault Newman','Trump', 'Apprentice', 'Mark Burnett', Manigault Newman','TAPES', 'Omarosa', 'Donald J. Trump','Omarosa', 'Donald J. Trump', 'Jacques Derrida', 'Derrida', 'Sigmund Freud', 'Mark Burnett', 'Manigault Newman', 'Manigault Newman', 'Trump', 'Mark Burnett' ]

Ideally what I'd have in the end is:       
corrected_list = [ 'Omarosa Manigault Newman', 'Omarosa Manigault Newman', 'Donald J. Trump', 'Apprentice', 'Mark Burnett', 'Omarosa Manigault Newman', 'TAPES', 'Omarosa', 'Donald J. Trump', 'Omarosa Manigault Newman', 'Donald J. Trump', 'Jacques Derrida', 'Jacques Derrida', 'Sigmund Freud', 'Mark Burnett', 'Omarosa Manigault Newman', 'Omarosa Manigault Newman', 'Donald J. Trump', 'Mark Burnett' ]

但是这样的列表也可以:

normalized_list = ['Omarosa Manigault Newman', 'Apprentice', 'Mark Burnett', 'TAPES', 'Jacques Derrida', 'Donald J. Trump', 'Sigmund Freud']

我想你要找的是每个字符串是否是列表中另一个字符串的子字符串?

如果列表很短,比如这个,我们可以用愚蠢的二次搜索来做到这一点:

corrected_list = []
for person in person_list:
    matches = (other for other in person_list if person in other)
    longest = max(matches, key=len)
    corrected_list.append(longest)

如果您的列表很大,这会太慢,我们需要做一些更聪明的事情,比如构建前缀和后缀尝试。但对于这么小的东西,我认为这太过分了。