摘要:完全匹配到此為止即每個字典有相同的長度相同的鍵每個鍵也對應相同的值則字典完全匹配返回值。在這種情況下,長的序列被認為是較大的。否則,通過類型名字的字母順序進行比較。總結列表元組的比較原則先大小后長短。
昨天看《核心編程》發現了一個鮮為人知的知識點,在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核心編程(第二版)》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45507.html
摘要:和都是目前在各自領域最流行的開發語言之一。在機器學習數據分析領域成為必學語言。 showImg(https://segmentfault.com/img/remote/1460000019167290); Golang和Python都是目前在各自領域最流行的開發語言之一。 Golang其高效而又友好的語法,贏得了很多后端開發人員的青睞,最適用于高并發網絡編程的語言之一。 Python不...
摘要:在機器學習數據分析領域成為必學語言。不定長參數,支持不定長參數,用定義參數名,調用時多個參數將作為一個元祖傳遞到函數內返回函數結果。showImg(https://user-gold-cdn.xitu.io/2019/5/13/16ab0b937e7329d4); Golang和Python都是目前在各自領域最流行的開發語言之一。 Golang其高效而又友好的語法,贏得了很多后端開發人員的青...
摘要:的基本數據類型中的變量不需要聲明。在里,只有一種整數類型,表示為長整型,沒有中的。字符串的截取的語法格式如下變量頭下標尾下標索引值以為開始值,為從末尾的開始位置。列表列表是中使用最頻繁的數據類型。注意構造包含或個元素的元組的特殊語法規則。 1、python3的基本數據類型 Python 中的變量不需要聲明。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創建。在 Python 中,...
摘要:列表列表是中使用最頻繁的數據類型。列表可以完成大多數集合類的數據結構實現。注意構造包含或個元素的元組的特殊語法規則。基本功能是進行成員關系測試和刪除重復元素。以下幾個內置的函數可以執行數據類型之間的轉換。 一、說明 Python 中的變量不需要聲明。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創建。在 Python 中,變量就是變量,它沒有類型,我們所說的類型是變量所指的內存中...
摘要:作者心葉時間中的變量不需要聲明。中有六個標準的數據類型數字字符串列表元組集合字典。字符串格式化我叫今年歲心葉我叫心葉今年歲如上所示,字符串支持格式化,當然,出來上面用到的和以外,還有一些別的,具體看文檔是不是感覺有點語言的味道。 作者:心葉時間:2018-04-21 09:28 Python 中的變量不需要聲明。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創建。 Python3...
閱讀 1403·2021-10-11 10:59
閱讀 3104·2019-08-30 15:54
閱讀 2724·2019-08-30 13:19
閱讀 2456·2019-08-30 13:02
閱讀 2372·2019-08-30 10:57
閱讀 3347·2019-08-29 15:40
閱讀 981·2019-08-29 15:39
閱讀 2300·2019-08-29 12:40