这个问题是别人问的,如下:
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中怎么用的也挺好。。。