Удалить похожие слова из списка - PullRequest
0 голосов
/ 29 августа 2018
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']

Из приведенного выше списка вы можете видеть, что Дас и Хима Дас повторяются. Я хочу только полные имена, то есть Хима Дас. Аналогично с Ушей и ПТ Ушей.

о / п, что мне нужно

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

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Я решил похожую проблему с помощью библиотеки 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».

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

0 голосов
/ 29 августа 2018
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)]
0 голосов
/ 29 августа 2018

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

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

Это решение 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 голосов
/ 29 августа 2018

Может быть понимание списка + any:

print([i for i in list1 if not any(i in x and i!=x for x in list1)])
...