为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑的夜晚无繁华 2022-07-19 20:15:45
根据我的研究,有两种简单的方法可以从列表中删除重复项:a = list(dict.fromkeys(a))和a = list(set(a))其中一个比另一个更有效吗?
查看完整描述

4 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

绝对第二个更有效,因为或多或少地为此目的创建了集合,并且您跳过了与创建更重的 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

这并不意味着它几乎快两倍。差别几乎看不出来。用不同的随机数据自己试试。


查看完整回答
反对 回复 2022-07-19
?
Qyouu

TA贡献1786条经验 获得超11个赞

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



查看完整回答
反对 回复 2022-07-19
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

如果我们有一个列表包含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()


查看完整回答
反对 回复 2022-07-19
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

注意:从 Python 3.7开始,dict的键是有序的

所以第一个使用的形式

list(dict.fromkeys(a)) # 保持顺序!!

在使用集合时保留顺序将可能(并且可能)更改列表“a”的元素的顺序。


查看完整回答
反对 回复 2022-07-19
  • 4 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信