Python: how to remove duplicates from a list using a set (order is important)
所以我有这个单子:
通过使用集合,我需要删除重复项,并保持它们的顺序一致。
我用了这个代码:
1 2 3 | def unique(a): a = set(a) return list(a) |
当我使用它时,它确实会删除重复项,但问题是它会按如下数字顺序返回它们:
1 2 | >>> unique(a) [-2, 2, 5, 6, 7, 8, 9, 10, 13, 14, -12, -11, -9, -8, -6, -5, -4, -3, -1] |
在使用集合删除重复项时,如何以与原始列表相同的顺序返回它?
编辑:
所以我使用这个代码是因为它起作用:
1 2 3 | def unique(a): seen = set() return [seen.add(x) or x for x in a if x not in seen] |
但是有人能给我解释一下它的作用吗?因为我需要再做一次,但它返回的列表没有负数,我不能这样做,除非我理解代码的作用。
该功能已经存在于
下面是代码的简化版本:
1 2 3 4 5 6 | def unique_everseen(iterable): seen = set() for element in iterable: if element not in seen: seen.add(element) yield element |
配方中的版本允许您不需要的
配方版本中的第一个优化很简单:查找
第二个优化是使用
要使它与
如果您只处理序列,而不是任意的iterables,并且您可以依靠python 2.7+,那么还有另一种方法可以做到这一点,它几乎同样有效,甚至更简单:
1 2 | def unique(a): return OrderedDict.fromkeys(a).keys() |
滥用清单理解:
1 2 3 4 | def unique(seq): seen = set() return [seen.add(x) or x for x in seq if x not in seen] # or use parentheses instead of brackets above for a generator |