使用 dict 和 set 从列表中删除重复项之间的区别?
Difference between removing duplicates from a list using dict and set?
根据我的研究,有两种简单的方法可以从列表中删除重复项:
a = list(dict.fromkeys(a))
和
a = list(set(a))
其中一个比另一个更有效吗?
当然,第二个更有效,因为集合或多或少是为此目的而创建的,并且您跳过了与创建 dict 相关的开销,后者更重。
性能方面,它绝对取决于实际有效载荷是什么。
import timeit
import random
input_data = [random.choice(range(100)) for i in range(1000)]
from_keys = timeit.timeit('list(dict.fromkeys(input_data))', number=10000, globals={'input_data': input_data})
from_set = timeit.timeit('list(set(input_data))', number=10000, globals={'input_data': input_data})
print(f"From keys performance: {from_keys:.3f}")
print(f"From set performance: {from_set:.3f}")
打印:
From keys performance: 0.230
From set performance: 0.140
这并不意味着它快了将近两倍。差异几乎看不出来。用不同的随机数据亲自尝试一下。
第二个答案更好,不仅因为它更快,而且它更好地显示了程序员的意图。 set()
是专门用来描述元素不可重复的数学集合的,因此它符合这个目的,reader的意图很明确。另一方面 dict()
用于存储键值对,并没有说明意图。
根据我的研究,有两种简单的方法可以从列表中删除重复项:
a = list(dict.fromkeys(a))
和
a = list(set(a))
其中一个比另一个更有效吗?
当然,第二个更有效,因为集合或多或少是为此目的而创建的,并且您跳过了与创建 dict 相关的开销,后者更重。 性能方面,它绝对取决于实际有效载荷是什么。
import timeit
import random
input_data = [random.choice(range(100)) for i in range(1000)]
from_keys = timeit.timeit('list(dict.fromkeys(input_data))', number=10000, globals={'input_data': input_data})
from_set = timeit.timeit('list(set(input_data))', number=10000, globals={'input_data': input_data})
print(f"From keys performance: {from_keys:.3f}")
print(f"From set performance: {from_set:.3f}")
打印:
From keys performance: 0.230
From set performance: 0.140
这并不意味着它快了将近两倍。差异几乎看不出来。用不同的随机数据亲自尝试一下。
第二个答案更好,不仅因为它更快,而且它更好地显示了程序员的意图。 set()
是专门用来描述元素不可重复的数学集合的,因此它符合这个目的,reader的意图很明确。另一方面 dict()
用于存储键值对,并没有说明意图。