日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

深入探究Python中的字典容器

發(fā)布時(shí)間:2024/5/7 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入探究Python中的字典容器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

字典(dictionary)

我們都曾經(jīng)使用過(guò)語(yǔ)言詞典來(lái)查找不認(rèn)識(shí)的單詞的定義。語(yǔ)言詞典針對(duì)給定的單詞(比如 python)提供一組標(biāo)準(zhǔn)的信息。這種系統(tǒng)將定義和其他信息與實(shí)際的單詞關(guān)聯(lián)(映射)起來(lái)。使用單詞作為鍵定位器來(lái)尋找感興趣的信息。這種概念延伸到 Python 編程語(yǔ)言中,就成了特殊的容器類型,稱為 字典(dictionary)。

字典(dictionary) 數(shù)據(jù)類型在許多語(yǔ)言中都存在。它有時(shí)候稱為關(guān)聯(lián) 數(shù)組(因?yàn)閿?shù)據(jù)與一個(gè)鍵值相關(guān)聯(lián)),或者作為散列表。但是在 Python 中,字典(dictionary) 是一個(gè)很好的對(duì)象,因此即使是編程新手也很容易在自己的程序中使用它。按照正式的說(shuō)法,Python 中的 字典(dictionary) 是一種異構(gòu)的、易變的映射容器數(shù)據(jù)類型。

創(chuàng)建字典

本系列中前面的文章介紹了 Python 編程語(yǔ)言中的一些容器數(shù)據(jù)類型,包括 tuple、string 和 list(參見(jiàn) 參考資料)。這些容器的相似之處是它們都是基于序列的。這意味著要根據(jù)元素在序列中的位置訪問(wèn)這些集合中的元素。所以,給定一個(gè)名為 a 的序列,就可以使用數(shù)字索引(比如 a[0] )或片段(比如 a[1:5])來(lái)訪問(wèn)元素。Python 中的 字典(dictionary) 容器類型與這三種容器類型的不同之處在于,它是一個(gè)無(wú)序的集合。不是按照索引號(hào),而是使用鍵值來(lái)訪問(wèn)集合中的元素。這意味著構(gòu)造字典(dictionary)容器比 tuple、string 或 list 要復(fù)雜一些,因?yàn)楸仨毻瑫r(shí)提供鍵和相應(yīng)的值,如清單 1 所示。

清單 1. 在 Python 中創(chuàng)建字典,第 1 部分

>>> d = {0: 'zero', 1: 'one', 2 : 'two', 3 : 'three', 4 : 'four', 5: 'five'} >>> d {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'} >>> len(d) >>> type(d) # Base object is the dict class <type 'dict'> >>> d = {} # Create an empty dictionary >>> len(d) >>> d = {1 : 'one'} # Create a single item dictionary >>> d {1: 'one'} >>> len(d) >>> d = {'one' : 1} # The key value can be non-numeric >>> d {'one': 1} >>> d = {'one': [0, 1,2 , 3, 4, 5, 6, 7, 8, 9]} >>> d {'one': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}

如這個(gè)例子所示,在 Python 中創(chuàng)建字典(dictionary)要使用花括號(hào)和以冒號(hào)分隔的鍵-值組合。如果沒(méi)有提供鍵-值組合,那么就會(huì)創(chuàng)建一個(gè)空的 dictionary。使用一個(gè)鍵-值組合,就會(huì)創(chuàng)建具有一個(gè)元素的 dictionary,以此類推,直至您需要的任何規(guī)模。與任何容器類型一樣,可以使用內(nèi)置的 len 方法查明集合中元素的數(shù)量。

前面的示例還演示了關(guān)于字典(dictionary)容器的另一個(gè)重要問(wèn)題。鍵并不限制為整數(shù);它可以是任何不易變的數(shù)據(jù)類型,包括 integer、float、tuple 或 string。因?yàn)?list 是易變的,所以它不能作為字典(dictionary)中的鍵。但是字典(dictionary)中的值可以是任何數(shù)據(jù)類型的。

最后,這個(gè)示例說(shuō)明了 Python 中字典(dictionary)的底層數(shù)據(jù)類型是 dict 對(duì)象。要進(jìn)一步了解如何使用 Python 中的 字典(dictionary),可以使用內(nèi)置的幫助解釋器來(lái)了解 dict 類,如清單 2 所示。

清單 2. 獲得關(guān)于字典(dictionary)的幫助

>>> help(dict)on class dict in module __builtin__:dict(object) | dict() -> new empty dictionary. | dict(mapping) -> new dictionary initialized from a mapping object's | (key, value) pairs. | dict(seq) -> new dictionary initialized as if via: | d = {} | for k, v in seq: | d[k] = v | dict(**kwargs) -> new dictionary initialized with the name=value pairs | in the keyword argument list. For example: dict(one=1, two=2) | | Methods defined here: | | __cmp__(...) | x.__cmp__(y) <==> cmp(x,y) | | __contains__(...) | x.__contains__(y) <==> y in x | | __delitem__(...) | x.__delitem__(y) <==> del x[y] ...

關(guān)于 dict 類的幫助指出,可以使用構(gòu)造函數(shù)直接創(chuàng)建字典(dictionary),而不使用花括號(hào)。既然與其他容器數(shù)據(jù)類型相比,在創(chuàng)建字典(dictionary)時(shí)必須提供更多的數(shù)據(jù),那么這些創(chuàng)建方法比較復(fù)雜也就不足為奇了。但是,在實(shí)踐中使用字典(dictionary)并不難,如清單 3 所示。

清單 3. 在 Python 中創(chuàng)建字典(dictionary),第 2 部分

>>> l = [0, 1,2 , 3, 4, 5, 6, 7, 8, 9] >>> d = dict(l)(most recent call last):File "<stdin>", line 1, in ?: can't convert dictionary update sequence element #0 to a sequence>>> l = [(0, 'zero'), (1, 'one'), (2, 'two'), (3, 'three')] >>> d = dict(l) >>> d {0: 'zero', 1: 'one', 2: 'two', 3: 'three'} >>> l = [[0, 'zero'], [1, 'one'], [2, 'two'], [3, 'three']] >>> d {0: 'zero', 1: 'one', 2: 'two', 3: 'three'} >>> d = dict(l) >>> d {0: 'zero', 1: 'one', 2: 'two', 3: 'three'} >>> d = dict(zero=0, one=1, two=2, three=3) >>> d {'zero': 0, 'three': 3, 'two': 2, 'one': 1} >>> d = dict(0=zero, 1=one, 2=two, 3=three): keyword can't be an expression

可以看到,創(chuàng)建字典(dictionary)需要鍵值和數(shù)據(jù)值。第一次從 list 創(chuàng)建字典(dictionary)的嘗試失敗了,這是因?yàn)闆](méi)有匹配的鍵-數(shù)據(jù)值對(duì)。第二個(gè)和第三個(gè)示例演示了如何正確地創(chuàng)建 字典(dictionary):在第一種情況下,使用一個(gè) list,其中的每個(gè)元素都是一個(gè) tuple;在第二種情況下,也使用一個(gè) list,但是其中的每個(gè)元素是另一個(gè) list。在這兩種情況下,內(nèi)層容器都用于獲得鍵到數(shù)據(jù)值的映射。

直接創(chuàng)建 dict 容器的另一個(gè)方法是直接提供鍵到數(shù)據(jù)值的映射。這種技術(shù)允許顯式地定義鍵和與其對(duì)應(yīng)的值。這個(gè)方法其實(shí)用處不大,因?yàn)榭梢允褂没ɡㄌ?hào)完成相同的任務(wù)。另外,如前面的例子所示,在采用這種方式時(shí)對(duì)于鍵不能使用數(shù)字,否則會(huì)導(dǎo)致拋出一個(gè)異常。

訪問(wèn)和修改字典(dictionary)

創(chuàng)建了 dictionary 之后,需要訪問(wèn)其中包含的數(shù)據(jù)。訪問(wèn)方式與訪問(wèn)任何 Python 容器數(shù)據(jù)類型中的數(shù)據(jù)相似,如清單 4 所示。

清單 4. 訪問(wèn) dictionary 中的元素

>>> d = dict(zero=0, one=1, two=2, three=3) >>> d {'zero': 0, 'three': 3, 'two': 2, 'one': 1} >>> d['zero'] >>> d['three'] >>> d = {0: 'zero', 1: 'one', 2 : 'two', 3 : 'three', 4 : 'four', 5: 'five'} >>> d[0] 'zero' >>> d[4] 'four' >>> d[6](most recent call last):File "<stdin>", line 1, in ?: 6 >>> d[:-1](most recent call last):File "<stdin>", line 1, in ?: unhashable type

可以看到,從字典(dictionary)中獲取數(shù)據(jù)值的過(guò)程幾乎與從任何容器類型中獲取數(shù)據(jù)完全一樣。在容器名后面的方括號(hào)中放上鍵值。當(dāng)然,字典(dictionary)可以具有非數(shù)字的鍵值,如果您以前沒(méi)有使用過(guò)這種數(shù)據(jù)類型,那么適應(yīng)這一點(diǎn)需要些時(shí)間。因?yàn)樵谧值?#xff08;dictionary)中次序是不重要的(dictionary 中數(shù)據(jù)的次序是任意的),所以可以對(duì)其他容器數(shù)據(jù)類型使用的片段功能,對(duì)于 字典(dictionary)是不可用的。試圖使用片段或者試圖從不存在的鍵訪問(wèn)數(shù)據(jù)就會(huì)拋出異常,指出相關(guān)的錯(cuò)誤。

Python 中的字典(dictionary)容器也是易變的數(shù)據(jù)類型,這意味著在創(chuàng)建它之后可以修改它。如清單 5 所示,可以添加新的鍵到數(shù)據(jù)值的映射,可以修改現(xiàn)有的映射,還可以刪除映射。

清單 5. 修改字典(dictionary)

>>> d = {0: 'zero', 1: 'one', 2: 'two', 3: 'three'} >>> d[0] 'zero' >>> d[0] = 'Zero' >>> d {0: 'Zero', 1: 'one', 2: 'two', 3: 'three'} >>> d[4] = 'four' >>> d[5] = 'five' >>> d {0: 'Zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'} >>> del d[0] >>> d {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'} >>> d[0] = 'zero' >>> d {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'}

清單 5 演示了幾個(gè)重點(diǎn)。首先,修改數(shù)據(jù)值是很簡(jiǎn)單的:將新的值分配給適當(dāng)?shù)逆I。其次,添加新的鍵到數(shù)據(jù)值的映射也很簡(jiǎn)單:將相關(guān)數(shù)據(jù)分配給新的鍵值。Python 自動(dòng)進(jìn)行所有處理。不需要調(diào)用 append 這樣的特殊方法。對(duì)于 dictionary 容器,次序是不重要的,所以這應(yīng)該好理解,因?yàn)椴皇窃谧值?#xff08;dictionary)后面附加映射,而是將它添加到容器中。最后,刪除映射的辦法是使用 del 操作符以及應(yīng)該從容器中刪除的鍵。

在清單 5 中有一個(gè)情況看起來(lái)有點(diǎn)兒怪,鍵值是按照數(shù)字次序顯示的,而且這個(gè)次序與插入映射的次序相同。不要誤解 —— 情況不總是這樣的。Python 字典(dictionary)中映射的次序是任意的,對(duì)于不同的 Python 安裝可能會(huì)有變化,甚至多次使用同一 Python 解釋器運(yùn)行相同代碼也會(huì)有變化。如果在一個(gè)字典(dictionary)中使用不同類型的鍵和數(shù)據(jù)值,那么就很容易看出這一點(diǎn),如清單 6 所示。

清單 6. 異構(gòu)的容器

>>> d = {0: 'zero', 'one': 1} >>> d {0: 'zero', 'one': 1} >>> d[0] 'zero' >>> type(d[0]) <type 'str'> >>> d['one'] >>> type(d['one']) <type 'int'> >>> d['two'] = [0, 1, 2] >>> d {0: 'zero', 'two': [0, 1, 2], 'one': 1} >>> d[3] = (0, 1, 2, 3) >>> d {0: 'zero', 3: (0, 1, 2, 3), 'two': [0, 1, 2], 'one': 1} >>> d[3] = 'a tuple' >>> d {0: 'zero', 3: 'a tuple', 'two': [0, 1, 2], 'one': 1}

如這個(gè)例子所示,可以在一個(gè)字典(dictionary)中使用不同數(shù)據(jù)類型的鍵和數(shù)據(jù)值。還可以通過(guò)修改字典(dictionary)添加新的類型。最后,產(chǎn)生的 dictionary 的次序并不與插入數(shù)據(jù)的次序匹配。本質(zhì)上,字典(dictionary)中元素的次序是由 Python 字典(dictionary)數(shù)據(jù)類型的實(shí)際實(shí)現(xiàn)控制的。新的 Python 解釋器很容易改變這一次序,所以一定不要依賴于元素在字典(dictionary)中的特定次序。

用字典(dictionary)進(jìn)行編程

作為正式的 Python 數(shù)據(jù)類型,字典(dictionary)支持其他較簡(jiǎn)單數(shù)據(jù)類型所支持的大多數(shù)操作。這些操作包括一般的關(guān)系操作符,比如 <、> 和 ==,如清單 7 所示。

清單 7. 一般關(guān)系操作符

>>> d1 = {0: 'zero'} >>> d2 = {'zero':0} >>> d1 < d2 >>> d2 = d1 >>> d1 < d2 >>> d1 == d2 >>> id(d1) >>> id(d2) >>> d2 = d1.copy() >>> d1 == d2 >>> id(d1) >>> id(d2)

前面的示例創(chuàng)建兩個(gè)字典(dictionary)并使用它們測(cè)試 < 關(guān)系操作符。盡管很少以這種方式比較兩個(gè)字典(dictionary);但是如果需要,可以這樣做。

然后,這個(gè)示例將賦值給變量 d1 的字典(dictionary)賦值給另一個(gè)變量 d2。注意,內(nèi)置的 id() 方法對(duì)于 d1 和 d2 返回相同的標(biāo)識(shí)符值,這說(shuō)明這不是復(fù)制操作。要想復(fù)制字典(dictionary) ,可以使用 copy() 方法。從這個(gè)示例中的最后幾行可以看出,副本與原來(lái)的字典(dictionary)完全相同,但是容納這字典(dictionary)的變量具有不同的標(biāo)識(shí)符。

在 Python 程序中使用字典(dictionary)時(shí),很可能希望檢查字典(dictionary)中是否包含特定的鍵或值。如清單 8 所示,這些檢查很容易執(zhí)行。

清單 8. 條件測(cè)試和字典(dictionary)

>>> d = {0: 'zero', 3: 'a tuple', 'two': [0, 1, 2], 'one': 1} >>> d.keys() [0, 3, 'two', 'one'] >>> if 0 in d.keys(): ... print 'True' ... >>> if 'one' in d: ... print 'True' ... >>> if 'four' in d: ... print 'Dictionary contains four' ... elif 'two' in d: ... print 'Dictionary contains two' ... contains two

測(cè)試字典(dictionary)中鍵或數(shù)據(jù)值的成員關(guān)系是很簡(jiǎn)單的。dictionary 容器數(shù)據(jù)類型提供幾個(gè)內(nèi)置方法,包括 keys() 方法和 values() 方法(這里沒(méi)有演示)。這些方法返回一個(gè)列表,其中分別包含進(jìn)行調(diào)用的字典(dictionary)中的鍵或數(shù)據(jù)值。

因此,要判斷某個(gè)值是否是字典(dictionary)中的鍵,應(yīng)該使用 in 操作符檢查這個(gè)值是否在調(diào)用 keys() 方法所返回的鍵值列表中。可以使用相似的操作檢查某個(gè)值是否在調(diào)用 values() 方法所返回的數(shù)據(jù)值列表中。但是,可以使用字典(dictionary)名作為簡(jiǎn)寫(xiě)表示法。這是有意義的,因?yàn)橐话阆M滥硞€(gè)數(shù)據(jù)值(而不是鍵值)是否在字典(dictionary)中。

在 “Discover Python, Part 6” 中,您看到了使用 for 循環(huán)遍歷容器中的元素是多么容易。同樣的技術(shù)也適用于 Python 字典(dictionary),如清單 9 所示。

清單 9. 迭代和字典(dictionary)

>>> d = {0: 'zero', 3: 'a tuple', 'two': [0, 1, 2], 'one': 1} >>> for k in d.iterkeys(): ... print d[k] ... tuple [0, 1, 2] >>> for v in d.itervalues(): ... print v ... tuple [0, 1, 2] >>> for k, v in d.iteritems(): ... print 'd[',k,'] = ',v ... [ 0 ] = zero[ 3 ] = a tuple[ two ] = [0, 1, 2][ one ] = 1

這個(gè)示例演示了遍歷字典(dictionary)的三種方式:使用從 iterkeys()、itervalues() 或 iteritems() 方法返回的 Python 迭代器。(順便說(shuō)一下,可以通過(guò)在字典(dictionary)上直接調(diào)用適當(dāng)方法,比如 d.iterkeys(),從而檢查這些方法是否返回一個(gè)迭代器而不是容器數(shù)據(jù)類型。)iterkeys() 方法允許遍歷字典(dictionary)的鍵,而 itervalues() 方法允許遍歷字典(dictionary)包含的數(shù)據(jù)值。另一方面,iteritems() 方法允許同時(shí)遍歷鍵到數(shù)據(jù)值的映射。

字典(dictionary):另一種強(qiáng)大的 Python 容器

本文討論了 Python 字典(dictionary)數(shù)據(jù)類型。字典(dictionary)是一種異構(gòu)的、易變的容器,依賴鍵到數(shù)據(jù)值的映射(而不是特定的數(shù)字次序)來(lái)訪問(wèn)容器中的元素。訪問(wèn)、添加和刪除字典(dictionary)中的元素都很簡(jiǎn)單,而且字典(dictionary)很容易用于復(fù)合語(yǔ)句,比如 if 語(yǔ)句或 for 循環(huán)。可以在字典(dictionary)中存儲(chǔ)所有不同類型的數(shù)據(jù),可以按照名稱或其他復(fù)合鍵值(比如 tuple)訪問(wèn)這些數(shù)據(jù),所以 Python 字典(dictionary)使開(kāi)發(fā)人員能夠編寫(xiě)簡(jiǎn)潔而又強(qiáng)大的編程語(yǔ)句。

總結(jié)

以上是生活随笔為你收集整理的深入探究Python中的字典容器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。