为何set函数[*set(nums)]对不同输入表现出不同行为?
为什么[*set(nums)]对不同输入表现出不同顺序?
这是因为Python里的set(集合)本身是无序容器,它既不保留元素的插入顺序,也不会自动按数值大小排序。当你用[*set(nums)]把集合转成列表时,列表的顺序完全由集合内部的存储逻辑决定,核心原因和哈希表的工作机制有关:
- Python的集合基于哈希表实现,每个元素会根据自身的哈希值被分配到哈希表的对应位置。
- 对于整数类型来说,它的哈希值就是自身(比如
hash(1) == 1、hash(100) == 100、hash(1000) == 1000)。 - 哈希表会根据哈希值计算元素的存储位置,不同哈希值的元素会被放到不同位置,所以当输入元素的哈希值差异较大时,集合内部的存储顺序就会变化,转成列表后的结果自然也就不一样。
结合你的例子来看:
- 输入
[1,2,2,100]时,元素哈希值为1、2、100,哈希表分配的位置让它们转成列表后呈现[1,2,100]的顺序。 - 输入
[1,2,2,1000]时,1000的哈希值远大于前两个元素,对应的存储位置在集合的最前端,所以转成列表后就变成了[1000,1,2]。
如果需要固定顺序,比如保留插入顺序或者按数值排序,可以用这些方法:
- 保留插入顺序:
list(dict.fromkeys(nums))(Python 3.7及以上版本的字典会保留插入顺序) - 按数值排序:
sorted(set(nums))
内容的提问来源于stack exchange,提问作者Priyank Sharma
相关产品推荐
相关产品推荐

