How to remove duplicates from a list in python
本问题已经有最佳答案,请猛点这里访问。
我有一张单子:
我想比较一下所有项目的相似性。
如果
编辑:
对不起,我的问题很困惑。
列表项是一组三角函数。我想删除列表中的类似项。
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'] |
实施例可能是一个
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距离(在这个例子中是不相关的例子是一个比较)
用你的
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] |
当然,如果你是真的不一致性消除的项目,有人建议,然后将大的工作集。
你可以使用
1 2 3 4 | >>>list = [1,2,3,4,4,5,2,3,1] >>>list =set(list) >>>list set([1, 2, 3, 4, 5]) |