从列表中删除类似的单词

时间:2018-08-29 10:30:28

标签: python list duplicates

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']

5 个答案:

答案 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)]