是否有内置功能可以从Python中的列表中删除重复项,同时保留顺序?我知道我可以使用一个集来删除重复项,但这会破坏原始顺序.我也知道我可以像这样滚动自己:
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
但是如果可能的话,我想利用内置或更多的Pythonic习语.
解决方法:
在这里你有一些选择:http://www.peterbe.com/plog/uniqifiers-benchmark
最快的一个:
def f7(seq):
seen = set()
seen_add = seen.add
return [x for x in seq if not (x in seen or seen_add(x))]
为什么将seen.add分配给seen_add而不是只调用seen.add? Python是一种动态语言,解析see.add每次迭代比解析局部变量更昂贵. seen.add可能在迭代之间发生了变化,并且运行时不够聪明,无法排除这种情况.为了安全起见,每次都必须检查对象.
如果您打算在同一个数据集上大量使用此功能,那么使用有序集合可能会更好:http://code.activestate.com/recipes/528878/
O(1)每次操作的插入,删除和成员检查.
(小附加说明:seen.add()始终返回None,因此或者上面仅作为尝试设置更新的方法,而不是逻辑测试的组成部分.)