资讯专栏INFORMATION COLUMN

Python标准类型的比较原则:字典VS列表(元组)

littleGrow / 851人阅读

摘要:完全匹配到此为止即每个字典有相同的长度相同的键每个键也对应相同的值则字典完全匹配返回值。在这种情况下,长的序列被认为是较大的。否则,通过类型名字的字母顺序进行比较。总结列表元组的比较原则先大小后长短。

昨天看《核心编程》发现了一个鲜为人知的知识点,在Python中的字典比较和列表比较的策略竟然不相同,下面做具体分析。

字典比较原则 例子
>>> dict1 = {}
>>> dict2 = {"host":"earth","port":80}
>>> cmp(dict1, dict2)
-1
>>> dict1["host"] = "earth"
>>> cmp(dict1,dict2)
-1

第一个比较中,dict1比dict2小,因为dict2有更多的元素(2个vs.0个)。在向dict1添加一个元素后,dict1仍然比dict2小(2个vs.1个),虽然添加的元素在dict2中也存在。

>>> dict1["port"] = 8080
>>> cmp(dict1, dict2)
1
>>> dict1["port"] = 80
>>> cmp(dict1, dict2)
0

在向dict1添加第二个元素后,两个字典的长度相同,所以用键比较大小。这时键相等,则通过它们的值比较大小。键"host"的值相同,对于键"port",dict1中值比dict2中的值大(8080 vs. 80)。当把dict2中"port"的值设成和dict1中的值一样,那么两个字典相等:它们有相同的大小、相同的键、相同的值,所以cmp()返回值是0。

>>> dict1["port"] = "tcp"
>>> cmp(dict1, dict2)
1
>>> dic2["port"] = "udp"
>>> cmp(dict1,dict2)
-1

当向两个字典中的仍和一个添加新元素时,这个字典马上会成为大的那个字典,就像例子中的dict1一样。向dict2添加键-值对后,因为两个字典的长度又相等了,会继续比较它们的键和值。

>>> cdict = {"fruits":1}
>>> ddict = {"fruits":1}
>>> cmp(cdict,ddict)
0
>>> cdict["oranges"] = 0
>>> ddict["apples"] = 0
>>> cmp(cdict, ddict)
14

上面的例子表明cmp()可以返回除-1、0、1外的其他值。

字典比较总结

字典比较的算法按照以下顺序进行:
(1)比较字典长度
如果字典的长度不同,那么用 cmp(dict1, dict2) 比较大小时,如果字典 dict1 比 dict2 长,cmp()返回正值,如果 dict2 比 dict1 长,则返回负值。也就是说,字典中的键的个数越多,这个字典就越大,即:
len(dict1) > len(dict2) ==> dict1 > dict2
(2)比较字典的键
如果两个字典的长度相同,那就按字典的键比较;键比较的顺序和 keys()方法返回键的顺序相同。 (注意: 相同的键会映射到哈希表的同一位置,这保证了对字典键的检查的一致性。) 这时,如果两个字典的键不匹配时,对这两个(不匹配的键)直接进行比较。当 dict1 中第一个不同的键大于 dict2 中第一个不同的键,cmp()会返回正值。
(3)比较字典的值
如果两个字典的长度相同而且它们的键也完全匹配,则用字典中每个相同的键所对应的值进行比较。一旦出现不匹配的值,就对这两个值进行直接比较。若 dict1 比 dict2 中相同的键所对应的值大,cmp()会返回正值。
(4)完全匹配
到此为止,即,每个字典有相同的长度、相同的键、每个键也对应相同的值,则字典完全匹配,返回 0 值。

列表比较原则 例子
>>> list1,list2 = [123,"xyz"],[456,"abc"]
>>> cmp(list1, list2)
-1
>>>
>>> cmp(list2, list1)
1
>>> list3 = list2 + [789]
>>> list3
[456,"abc",789]
>>>
>>> cmp(list2,list3)
-1

当我们比较list1和list2时,list1和list2逐项比较。第一个比较操作发生在两个列表的第一个元素之间,比如说,123与456比较,因为123<456,所以list1被认为小于list2
如果比较的值相等,那么两个序列的下一个值继续比较,知道不相等的情况出现,或者到达较短的一个序列的末尾。在这种情况下,长的序列被认为是较大的。这就是为什么上面list2元组类型的比较也是用这种算法。

列表比较总结

列表比较的算法按照以下顺序进行:
(1)对两个列表的元组进行比较
(2)如果比较的元素是同类型的,则比较其值,返回结果。
(3)如果两个元素不是同一种类型,则检查他们是否是数字。

a.如果是数字,执行必要的数字强制类型转换,然后比较。
b.如果有一方的元素是数字,则另一方的元素“大”(数字是“最小的”)。
c.否则,通过类型名字的字母顺序进行比较。

(4)如果有一个列表首先到达末尾,则另一个长一点的列表“大”。
(5)如果我们用尽了两个列表的元素而且所有的元素都是相等的,那么结果就是个平局,就是说返回一个0。

总结

列表(元组)的比较原则:先大小后长短。
字典的比较原则:先长短,再键,再值。

参考来源

《Python核心编程(第二版)》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45507.html

相关文章

  • 对比学习:Golang VS Python3

    摘要:和都是目前在各自领域最流行的开发语言之一。在机器学习数据分析领域成为必学语言。 showImg(https://segmentfault.com/img/remote/1460000019167290); Golang和Python都是目前在各自领域最流行的开发语言之一。 Golang其高效而又友好的语法,赢得了很多后端开发人员的青睐,最适用于高并发网络编程的语言之一。 Python不...

    Jason 评论0 收藏0
  • 对比学习:Golang VS Python3

    摘要:在机器学习数据分析领域成为必学语言。不定长参数,支持不定长参数,用定义参数名,调用时多个参数将作为一个元祖传递到函数内返回函数结果。showImg(https://user-gold-cdn.xitu.io/2019/5/13/16ab0b937e7329d4); Golang和Python都是目前在各自领域最流行的开发语言之一。 Golang其高效而又友好的语法,赢得了很多后端开发人员的青...

    刘东 评论0 收藏0
  • python3学习笔记(2)----python数据类型

    摘要:的基本数据类型中的变量不需要声明。在里,只有一种整数类型,表示为长整型,没有中的。字符串的截取的语法格式如下变量头下标尾下标索引值以为开始值,为从末尾的开始位置。列表列表是中使用最频繁的数据类型。注意构造包含或个元素的元组的特殊语法规则。 1、python3的基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,...

    陆斌 评论0 收藏0
  • Python3基础数据类型

    摘要:列表列表是中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。注意构造包含或个元素的元组的特殊语法规则。基本功能是进行成员关系测试和删除重复元素。以下几个内置的函数可以执行数据类型之间的转换。 一、说明 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的类型是变量所指的内存中...

    Rindia 评论0 收藏0
  • Python3中六种标准数据类型简单说明和理解

    摘要:作者心叶时间中的变量不需要声明。中有六个标准的数据类型数字字符串列表元组集合字典。字符串格式化我叫今年岁心叶我叫心叶今年岁如上所示,字符串支持格式化,当然,出来上面用到的和以外,还有一些别的,具体看文档是不是感觉有点语言的味道。 作者:心叶时间:2018-04-21 09:28 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 Python3...

    Cheng_Gang 评论0 收藏0

发表评论

0条评论

littleGrow

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<