让我们来看看在Python中从列表中去除重复的几个习惯性方法。
方法 #1 - 创建一个新的列表 (最简单)
这是最容易编码的算法,但是因为它需要创建一个新的列表,所以需要更多的内存,而且速度也有点慢。
def remove_duplicates(original):
deduped = []
for item in original:
if item not in deduped:
deduped.append(item)
return deduped
我们在这里利用了Python的in关键字,只在最后的列表中加入每一个项目,如果它还没有出现的话。
方法 #2 - 用语法糖创建一个新的列表 (代码更少,更难理解)
def remove_duplicates(original):
deduped = []
[deduped.append(item) for item in original if item not in deduped]
return deduped
从性能的角度看,这是完全相同的代码,但只用了一行。如果你喜欢打代码高尔夫,那么这可能是你的解决方案。
方法#3 - 使用内置的 "集合 "数据结构(快速,失去顺序)
A [set()](https://www.w3schools.com/python/python_sets.asp)是一个不包含任何重复值的值组。通过将一个列表转换为一个集合,然后再返回,你就可以删除所有的重复值。这里的主要缺点是你会失去你的排序。
def remove_duplicates(original):
return list(set(original))
这种方法在大多数情况下会比前两种方法更快,因为每次传输都是用big-o符号术语O(n) 。一组两个O(n) 的操作比一个O(n^2) 的操作要快。作为奖励,它甚至使用更少的代码。
方法 #4 - 使用一个有序的字典(快速,保持秩序)
通过使用集合库的OrderedDict类型,我们可以保持列表的顺序,同时保持与set() 相同的大O。
from collections import OrderedDict
def remove_duplicates(original):
return list(OrderedDict.fromkeys(original))