pyhon中集合无序但int型却以一个固定顺序输出的问题及其背后的哈希原理

这个问题是别人问的,如下:

set1={x*2 for x in “1234”}
set2={x for x in (2,1,3,4)}
print(set1,set2)

开始我也是说集合是无序的啊,纠结这干嘛,但是后来发现每次运行结果set1都不一样,set2却总是固执的{8,2,4,6}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
于是这个晚上我就钻进了这个牛角尖,开始研究集合背后的原理。

原来python中集合和字典的实现方式是哈希表,对,就是数据结构中的哈希表,通过哈希函数计算出哈希值,存放到哈希表中。

下面我们来研究下set1和set2的不同

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从而发现当集合里存储的是字符串的时候,每一次运行哈希值都不一样,所以显示顺序也是无序的,每次都不一样。

在这里插入图片描述
但如果集合里的是int型,运行出来的哈希值每次都是固定的就是数字本身,得到的就是同样的结果。
但是下个问题来了,比如1224打印出来就是按照哈希值1234


但是2468打印出来就永远是8246,而哈希值却确实还是数字本身,于是就开始凌乱了。

在这里插入图片描述

在这里插入图片描述
于是又拿到jupyter notebook里执行,结果发现set2本身确实是{2,4,6,8},但是print后就是{8,2,4,6},所以说明是print函数的问题

在这里插入图片描述
然后就没办法再研究下去了,但是在这过程中还是搞清楚了很多python的集合和字典背后的原理。

这篇文章不错,自己也留存一下
数据类型第2篇「字典和集合的原理和应用」

https://zhuanlan.zhihu.com/p/337231628

不过集合确实主要就是去重的,研究这是没大用,不过也研究了一晚上,再次加深了对哈希的理解,和它在python中怎么用的也挺好。。。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值