0

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

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

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']
4

1 回答 1

1

我认为您正在寻找的是每个字符串是否是列表中另一个字符串的子字符串?

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

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)

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

于 2018-08-17T01:33:02.943 回答