保持顺序的现代方法是:
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(lseparatedOrbList))
正如Raymond Hettinger在这个回答中所讨论的那样。在Python 3.5及以上版本中,这也是最快的方法 - 有关详细信息,请参见链接的答案。但是,键必须是可散列的(我认为在您的列表中是这种情况)
从Python 3.7开始,有序字典成为一种语言特性,因此上述调用变为:
>>> list(dict.fromkeys(lseparatedOrbList))
表现:
"""Dedup list."""
import sys
import timeit
repeat = 3
numbers = 1000
setup = """"""
def timer(statement, msg='', _setup=None):
print(msg, min(
timeit.Timer(statement, setup=_setup or setup).repeat(
repeat, numbers)))
print(sys.version)
s = """import random; n=%d; li = [random.randint(0, 100) for _ in range(n)]"""
for siz, m in ((150, "\nFew duplicates"), (15000, "\nMany duplicates")):
print(m)
setup = s % siz
timer('s = set(); [i for i in li if i not in s if not s.add(i)]', "s.add(i):")
timer('list(dict.fromkeys(li))', "dict:")
timer('list(set(li))', 'Not order preserving: list(set(li)):')
提供:
3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)]
Few duplicates
s.add(i): 0.008242200000040611
dict: 0.0037373999998635554
Not order preserving: list(set(li)): 0.0029409000001123786
Many duplicates
s.add(i): 0.2839437000000089
dict: 0.21970469999996567
Not order preserving: list(set(li)): 0.102068700000018
使用集合set
的列表推导式list(set)
虽然速度更快,但是无法保留原始列表顺序,而这里需要保留原始顺序。尽管相对于集合添加元素,使用字典dict
似乎始终更快一些,但不确定如果进一步改变数字是否会产生不同的结果。