小编典典

如何在保留顺序的同时从列表中删除重复项?

all

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

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

阅读 84

收藏
2022-02-25

共1个答案

小编典典

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.addseen_add而不是仅仅调用seen.add?Python 是一种动态语言,解析seen.add每次迭代比解析局部变量的成本更高。seen.add可能在迭代之间发生了变化,并且运行时不够聪明,无法排除这种情况。为了安全起见,它必须每次都检查对象。

O (1) 每个操作的插入、删除和成员检查。

(小的补充说明:seen.add()总是返回None,所以or上面的内容只是作为尝试集合更新的一种方式,而不是作为逻辑测试的一个组成部分。)

2022-02-25