python – 如何在保留订单的同时从列表中删除重复项?

是否有内置功能可以从Python中的列表中删除重复项,同时保留顺序?我知道我可以使用一个集来删除重复项,但这会破坏原始顺序.我也知道我可以像这样滚动自己:

def uniq(input):
  output = []
  for x in input:
    if x not in output:
      output.append(x)
  return output

(感谢unwindunwind.)

但是如果可能的话,我想利用内置或更多的Pythonic习语.

相关问题:In Python, what is the fastest algorithm for removing duplicates from a list so that all elements are unique while preserving order?

解决方法:

在这里你有一些选择: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,因此或者上面仅作为尝试设置更新的方法,而不是逻辑测试的组成部分.)

上一篇:检查重复的Javascript对象


下一篇:mysql – 返回重复记录