python set有序还是无序,python中哪些是无序

  python set有序还是无序,python中哪些是无序

  熟悉python的人都知道,python为我们提供了各种原生数据结构,比如list、tuple、set、dict等等。这些各种各样的数据结构为程提供了业务支持。但是要利用好这些对象,就必须了解这些结构的特点。比如简单的区分:可变与不可变,有序与无序。那么这篇文章想和大家分享一下这种紊乱的细节。

  在我们开始之前,这个python郑重声明,集合和字典都是乱序的!和收藏字典都出问题了!和收藏字典都出问题了!不要看完这条蛇,然后得出一些奇怪的结论!本文基于python3.6,你是什么还是2.7?醒醒吧兄弟2018年了o(_)o哈哈

  字典和收藏都乱了。只要稍微懂一点python的人,都很熟悉这句话。当你第一次接触python的时候,你学习了什么是iterable对象(大部分都想知道for循环可以遍历什么),什么是可变iterable对象,什么是不可变iterable对象,什么是无序,什么是有序。但你想过证明紊乱吗?自然,这条python也不例外。那你怎么证明紊乱呢?简单的暴力解决方案,只需写两行代码,定义一个集合然后打印出来就能看到结果了!我的测试代码如下:

  S={a , b , c}print(s)真的很简单,很暴力,很直接。看到这两行代码没有感叹,人生苦短,所以用python(这个Python大学的java)。好吧,我疯狂运行这个程序,输出结果自然不是唯一的。紊乱!就是这个意思~

  但事情没那么简单。我无意用int类型再试一次,如下:

  S={1,2,3}print(s)猜猜发生了什么?在这种情况下,无论我多么疯狂地输出和运行这段代码,我得到的唯一结果是打印{1,2,3}

  通过反复尝试,我发现只要是int类型,那么集合似乎就变得有序了。不管在声明这个集合时数字是如何排列的,输出结果总是按照固定的顺序!同样,我将dict字典的键值设置为int类型,此时字典就变成了固定的排序方式。这是为什么呢?

  此时,这条蛇需要继续声明set和dict出问题了!不要怀疑自己的专业知识。那么为什么会出现这种情况呢?答案只能从底层源代码中找到。简单来说,字典和集合的无序在python中是如何实现的?

  字典和集合乱序的实现是哈希表。没错,他们通过哈希值将对象放入哈希表,从而实现无序操作(众所周知,对象的哈希值是不断变化的)。代码如下:

  S={a , b , c } print(hash( a ))print(hash( c ))print(s)通过打印出哈希值,结果一目了然~

  如上图所示,每次哈希值不同,那么字符ABC在哈希表中的位置也不同。而集合是按照哈希表排列的,实现了集合的无序。那么,我们对int类型进行同样的操作会怎么样呢?

  S={1,2,3 } print(hash(1))print(hash(2))print(hash(3))print(s)到这一步,有些猿可能已经知道结果了。是的,结果如下:

  不管我怎么努力输出,123的哈希值就是这么任性,就是123。是的,python中int类型的哈希值就是它本身,所以set或dict中的排序方法是通过哈希表实现的,所以自然顺序不会改变。

  于是,问题解决了~正是因为hash才造成了这种奇怪的现象。说到哈希表,不得不佩服python的精妙。dict是原生数据结构中常用的工具,用来存储大量复杂数据,类似于数据库。在这种情况下,查询效率真的是关键。使用哈希表,以空间换时间的方式大大提高了查询效率,精彩~

  所以!我不知道你在做随机列表的时候会不会这么做。反正这个python做到了(年少无知~),类似于下面这段代码:

  L=[a , b , c] l=list (set (l)) print (l)有吗?完美!精简!随机做。我甚至没有导入随机模块!如果转到一个没有重复对象的集合,那么转回来就是随机的~那么通过上面的分析,当int类型出现的时候,这种随机性就失去了意义~避免这样使用。而且在实际制作过程中,如果用列表随机解释,会有重复值~如果没有。为什么不用set。 ( 916

  所以!记住那套坏了!不要利用int值是有序的!简单来说,我运行的时候用cPython做解释器,其他结果可能会不一样~而且python是胶水语言,万能的中央空调,可以匹配一切~所以不能保证你的代码一定只会用Cpython做解释器。所以set和dict是无序的~但是在无序的世界里也有小惊喜等着我们去发现~

  感谢阅读~我是大蟒蛇,希望用轻松愉快的语气给大家讲解一下我遇到的事情,或者帮助大家解决python中的问题,也希望给python初学者带来收获~ ~希望大家能玩一把语言~ ~很有意思~

  本文可以转载,但是必须声明原作者,所以不要告诉我,因为交流是最好的,但是请珍惜这条蛇的劳动成果~ ~

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: