Удалить похожие слова из списка

1
list1=['Usha', 'Das', 'Anas', 'Chand', 'Tokyo', 'Milkha Singh', 'Gurbachan Singh Randhawa', 'PT Usha', 'KM Beenamol', 'Hima Das', 'under-20', 'Muhammed Anas', 'Dutee Chand', 'the Asian Games', 'Asian Games', 'Olympic Games']

Из приведенного выше списка вы можете видеть, что Das и Hima Das повторяются. Мне нужны только полные имена Hima Das. Аналогично с Ушей и П. С. Ушей.

o/p что мне нужно

['Tokyo', 'Milkha Singh', 'Gurbachan Singh Randhawa', 'PT Usha', 'KM Beenamol', 'Hima Das', 'under-20', 'Muhammed Anas', 'Dutee Chand', 'Asian Games', 'Olympic Games']
Теги:
list
duplicates

4 ответа

2

Я решил подобную проблему, используя библиотеку Fuzzy Wuzzy. Он вернет слова, похожие на другие элементы в вашем списке, исходя из ряда факторов.

all_names=['Usha', 'Das', 'Anas', 'Chand', 'Tokyo', 'Milkha Singh', 'Gurbachan Singh Randhawa', 'PT Usha', 'KM Beenamol', 'Hima Das', 'under-20', 'Muhammed Anas', 'Dutee Chand', 'the Asian Games', 'Asian Games', 'Olympic Games']

for name in list1:
    matches = fuzzy.extractBests(name, list1)

Здесь вы можете найти самое длинное совпадение в списке матчей и рассматривать это как ваш "кандидат". например, "Das" в какой-то степени будут соответствовать "Hima Das", поэтому они будут возвращены, и по длине вы выберете "Hima Das".

Затем добавьте совпадения кандидатов в набор, чтобы убедиться, что они уникальны.

2

Возможно, понимание списка + any:

print([i for i in list1 if not any(i in x and i!=x for x in list1)])
  • 0
    Это работает. Спасибо
  • 0
    Обратите внимание, что для большого списка ввода это намного медленнее, чем использование набора.
Показать ещё 1 комментарий
2

Создайте набор отдельных слов из каждого элемента в списке с более чем одним словом.

Затем используйте функцию "Список" для фильтрации элементов, которые полностью находятся в этом наборе.

Это решение O(n) которое лучше всего подходит для эффективности (лучше, чем просто проверка в списке, как это O(n^2)).

parts = {w for e in list1 if ' ' in e for w in e.split()}
out = [e for e in list1 if e not in parts]
0
list1=['Usha', 'Das', 'Anas', 'Chand', 'Tokyo', 'Milkha Singh',
     'Gurbachan Singh Randhawa', 'PT Usha', 'KM Beenamol', 'Hima Das', 'under-20', 
      'Muhammed Anas', 'Dutee Chand', 'the Asian Games', 'Asian Games', 'Olympic Games']

 new_list = [value for value in list1 if not any(value in value2 for value2 in list1 if value2 != value)]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню