Итерация по списку строк в Python 3, сопоставление каждого элемента с остальными и возвращение наибольшего совпадения

У меня есть список питонов. В этом списке мне нужно сравнить каждый элемент с остальными и заменить короткие строки самыми длинными.

РЕДАКТИРОВАТЬ: У меня есть список имен людей, которые я получаю с помощью модуля 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']

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)

Если бы ваш список был огромным, это было бы слишком медленно, и нам нужно было бы сделать что-то более умное, например, создать префиксы и суффиксы. Но для чего-то такого маленького, я думаю, это излишне.

Другие вопросы по тегам