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的全名。与Usha和PT Usha类似。
我需要什么
['Tokyo', 'Milkha Singh', 'Gurbachan Singh Randhawa', 'PT Usha', 'KM Beenamol', 'Hima Das', 'under-20', 'Muhammed Anas', 'Dutee Chand', 'Asian Games', 'Olympic Games']
答案 0 :(得分:2)
也许是列表理解+ any
:
print([i for i in list1 if not any(i in x and i!=x for x in list1)])
答案 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]
答案 2 :(得分: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”。
然后将候选匹配项添加到集合中以确保它们是唯一的。
答案 3 :(得分: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)]
答案 4 :(得分:0)
使用 for 循环:
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']
uniques = []
for i in list1:
if i not in uniques:
uniques.append(i)
print(uniques)
使用列表理解:
uniques = [(i for i in list1 if not any(i in x and i!=x for x in list1)]