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']
Я решил подобную проблему, используя библиотеку 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".
Затем добавьте совпадения кандидатов в набор, чтобы убедиться, что они уникальны.
Возможно, понимание списка + any
:
print([i for i in list1 if not any(i in x and i!=x for x in list1)])
Создайте набор отдельных слов из каждого элемента в списке с более чем одним словом.
Затем используйте функцию "Список" для фильтрации элементов, которые полностью находятся в этом наборе.
Это решение 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]
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)]