猿问

使用 dict 和 set 从列表中删除重复项之间的区别?

根据我的研究,有两种简单的方法可以从列表中删除重复项:

a = list(dict.fromkeys(a))

a = list(set(a))

其中一个比另一个更有效吗?


慕尼黑的夜晚无繁华
浏览 109回答 4
4回答

函数式编程

绝对第二个更有效,因为或多或少地为此目的创建了集合,并且您跳过了与创建更重的 dict 相关的开销。性能方面,它绝对取决于有效负载的实际情况。import timeitimport randominput_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.230From set performance: 0.140这并不意味着它几乎快两倍。差别几乎看不出来。用不同的随机数据自己试试。

Qyouu

第二个答案更好,不仅因为它更快,而且更好地显示了程序员的意图。set()专门设计用于描述元素不能重复的数学集合,因此它符合这个目的,并且读者的意图很清楚。另一方面dict()是用于存储键值对并且没有说明意图。

料青山看我应如是

如果我们有一个列表包含a = [1,16,2,3,4,5,6,8,10,3,9,15,7]我们使用a = list(set(a))该set()函数将删除重复项并重新排序我们的列表,新列表将如下所示[1,2,3,4,5,6,7,8,9,10,15,16],而如果我们使用a = list(dict.fromkeys(a))该dict.fromkeys()函数将删除重复项并保持列表元素的顺序相同[1,16,2,3,4,5,6,8,10,9,15,7]。总而言之,如果您正在寻找一种从列表中删除重复项而不关心重新排序列表的方法,那么set()这就是您正在寻找的,但是!如果需要保持列表的顺序,那么您可以使用dict.fromkeys()

幕布斯6054654

注意:从 Python 3.7开始,dict的键是有序的。所以第一个使用的形式list(dict.fromkeys(a)) # 保持顺序!!在使用集合时保留顺序将可能(并且可能)更改列表“a”的元素的顺序。
随时随地看视频慕课网APP

相关分类

Python
我要回答