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
这并不意味着它几乎快两倍。差别几乎看不出来。用不同的随机数据自己试试。
TA贡献1786条经验 获得超11个赞
第二个答案更好,不仅因为它更快,而且更好地显示了程序员的意图。set()
专门设计用于描述元素不能重复的数学集合,因此它符合这个目的,并且读者的意图很清楚。另一方面dict()
是用于存储键值对并且没有说明意图。
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()
TA贡献1876条经验 获得超7个赞
注意:从 Python 3.7开始,dict的键是有序的。
所以第一个使用的形式
list(dict.fromkeys(a)) # 保持顺序!!
在使用集合时保留顺序将可能(并且可能)更改列表“a”的元素的顺序。
添加回答
举报