是否有一个内置程序可以从 Python 中的列表中删除重复项,同时保留顺序?我知道我可以使用一组来删除重复项,但这会破坏原始顺序。我也知道我可以像这样滚动自己:
def uniq(input): output = [] for x in input: if x not in output: output.append(x) return output
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 是一种动态语言,解析seen.add每次迭代比解析局部变量的成本更高。seen.add可能在迭代之间发生了变化,并且运行时不够聪明,无法排除这种情况。为了安全起见,它必须每次都检查对象。
seen.add
seen_add
O (1) 每个操作的插入、删除和成员检查。
(小的补充说明:seen.add()总是返回None,所以or上面的内容只是作为尝试集合更新的一种方式,而不是作为逻辑测试的一个组成部分。)
seen.add()
None
or