如何从python中的列表中删除重复项

How to remove duplicates from a list in python

本问题已经有最佳答案,请猛点这里访问。

我有一张单子:list = ['item1', 'item2', 'item3', 'item4']

我想比较一下所有项目的相似性。

如果item2item3相似,则结果为list = ['item1', 'item2', 'item4']

编辑:

对不起,我的问题很困惑。

列表项是一组三角函数。我想删除列表中的类似项。

1
list = [('very','beauty','place'),('very','good','place'),('another','trigram','item')]

通过计算该列表中每个成对项目的jaccard相似性,如果成对项目的jaccard得分大于0.4,我称之为相似。在这个例子中,item1和item2是相似的。我想要的最后一个输出是:

1
list = [('very','beauty','place'),('another','trigram','item')]

这是计算JACCard分数的方法:

1
2
3
def compute_jaccard_index(set_1, set_2):
   n = len(set_1.intersection(set_2))
   return n / float(len(set_1) + len(set_2) - n)


如果这些项目是字符串或数字,你是在寻找对象集。

中的例子:

1
2
3
4
5
6
7
In [1]: foo = [1, 32, 4, 5, 6, 5]

In [2]: set(foo)
Out[2]: {1, 4, 5, 6, 32}

In [3]: list(set(foo))
Out[3]: [32, 1, 4, 5, 6]

真的取决于你用类似的均方根。


该解决方案将继续看,直到它已对两个元素没有任何期待的所有对的过滤。这不是一个有效的解决方案,它将继续看一遍又一遍的对,和它的使用,也没有使可能的传递性。但它的启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> from itertools import combinations
>>> def filterSimilar (d):
        while True:
            filteredOne = False
            for s, t in combinations(d, 2):
                if isSimilar(s, t):
                    d.remove(t)
                    filteredOne = True
                    break
            if not filteredOne:
                break
>>> d = ['asdf', 'asxf', 'foo', 'bar', 'baz']  
>>> filterSimilar(d)
>>> d
['asdf', 'foo', 'bar']

实施例可能是一个isSimilar以下两个字符串之间的编辑距离的使用。

1
2
3
4
5
6
7
8
9
def levenshteinDistance (s, t):
    if len(s) == 0:
        return len(t)
    if len(t) == 0:
        return len(s)
    return min(levenshteinDistance(s[:-1], t) + 1, levenshteinDistance(s, t[:-1]) + 1, levenshteinDistance(s[:-1], t[:-1]) + (0 if s[-1] == t[-1] else 1))

def isSimilar (s, t):
    return levenshteinDistance(s, t) < 2

(请注意,我使用Levenshtein距离(在这个例子中是不相关的例子是一个比较)

用你的compute_jaccard_index函数,函数的isSimilar:现在看起来像这样

1
2
def isSimilar (s, t):
    return compute_jaccard_index(s, t) > .4

然后用你的例子日期:

1
2
3
4
>>> lst = [{'very','beauty','place'},{'very','good','place'},{'another','trigram','item'}]
>>> filterSimilar(lst)
>>> lst
[{'very', 'beauty', 'place'}, {'item', 'trigram', 'another'}]


这将工作,如果你有一个相似的功能比较:而直.

1
2
3
4
5
6
7
8
itemsToRemove = []
n = len(list)
for i in range(n):
  for j in range(i+1,n):
      if(similarTest(list[i], list[j]):
        itemsToRemove.append(list[i])
        break
return [item for item in list if item not in itemsToRemove]

当然,如果你是真的不一致性消除的项目,有人建议,然后将大的工作集。


你可以使用set.it将删除所有重复的元素,从列表中。

1
2
3
4
>>>list = [1,2,3,4,4,5,2,3,1]
>>>list =set(list)
>>>list
set([1, 2, 3, 4, 5])