欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳細(xì)探究Python中的字典容器

 更新時間:2015年04月14日 09:31:16   作者:IBM  
這篇文章主要介紹了Python中的字典容器,本文來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下

dictionary

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

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

本系列中前面的文章介紹了 Python 編程語言中的一些容器數(shù)據(jù)類型,包括 tuple、string 和 list(參見 參考資料)。這些容器的相似之處是它們都是基于序列的。這意味著要根據(jù)元素在序列中的位置訪問這些集合中的元素。所以,給定一個名為 a 的序列,就可以使用數(shù)字索引(比如 a[0] )或片段(比如 a[1:5])來訪問元素。Python 中的 dictionary 容器類型與這三種容器類型的不同之處在于,它是一個無序的集合。不是按照索引號,而是使用鍵值來訪問集合中的元素。這意味著構(gòu)造 dictionary 容器比 tuple、string 或 list 要復(fù)雜一些,因為必須同時提供鍵和相應(yīng)的值,如清單 1 所示。
清單 1. 在 Python 中創(chuàng)建 dictionary,第 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]}

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

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

最后,這個示例說明了 Python 中 dictionary 的底層數(shù)據(jù)類型是 dict 對象。要進(jìn)一步了解如何使用 Python 中的 dictionary,可以使用內(nè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,而不使用花括號。既然與其他容器數(shù)據(jù)類型相比,在創(chuàng)建 dictionary 時必須提供更多的數(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 的嘗試失敗了,這是因為沒有匹配的鍵-數(shù)據(jù)值對。第二個和第三個示例演示了如何正確地創(chuàng)建 dictionary:在第一種情況下,使用一個 list,其中的每個元素都是一個 tuple;在第二種情況下,也使用一個 list,但是其中的每個元素是另一個 list。在這兩種情況下,內(nèi)層容器都用于獲得鍵到數(shù)據(jù)值的映射。

直接創(chuàng)建 dict 容器的另一個方法是直接提供鍵到數(shù)據(jù)值的映射。這種技術(shù)允許顯式地定義鍵和與其對應(yīng)的值。這個方法其實(shí)用處不大,因為可以使用花括號完成相同的任務(wù)。另外,如前面的例子所示,在采用這種方式時對于鍵不能使用數(shù)字,否則會導(dǎo)致拋出一個異常。
訪問和修改 dictionary

創(chuàng)建了 dictionary 之后,需要訪問其中包含的數(shù)據(jù)。訪問方式與訪問任何 Python 容器數(shù)據(jù)類型中的數(shù)據(jù)相似,如清單 4 所示。
清單 4. 訪問 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ù)值的過程幾乎與從任何容器類型中獲取數(shù)據(jù)完全一樣。在容器名后面的方括號中放上鍵值。當(dāng)然,dictionary 可以具有非數(shù)字的鍵值,如果您以前沒有使用過這種數(shù)據(jù)類型,那么適應(yīng)這一點(diǎn)需要些時間。因為在 dictionary 中次序是不重要的(dictionary 中數(shù)據(jù)的次序是任意的),所以可以對其他容器數(shù)據(jù)類型使用的片段功能,對于 dictionary 是不可用的。試圖使用片段或者試圖從不存在的鍵訪問數(shù)據(jù)就會拋出異常,指出相關(guān)的錯誤。

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

在清單 5 中有一個情況看起來有點(diǎn)兒怪,鍵值是按照數(shù)字次序顯示的,而且這個次序與插入映射的次序相同。不要誤解 —— 情況不總是這樣的。Python dictionary 中映射的次序是任意的,對于不同的 Python 安裝可能會有變化,甚至多次使用同一 Python 解釋器運(yùn)行相同代碼也會有變化。如果在一個 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}

如這個例子所示,可以在一個 dictionary 中使用不同數(shù)據(jù)類型的鍵和數(shù)據(jù)值。還可以通過修改 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 支持其他較簡單數(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)建兩個 dictionary 并使用它們測試 < 關(guān)系操作符。盡管很少以這種方式比較兩個 dictionary;但是如果需要,可以這樣做。

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

在 Python 程序中使用 dictionary 時,很可能希望檢查 dictionary 中是否包含特定的鍵或值。如清單 8 所示,這些檢查很容易執(zhí)行。
清單 8. 條件測試和 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

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

因此,要判斷某個值是否是 dictionary 中的鍵,應(yīng)該使用 in 操作符檢查這個值是否在調(diào)用 keys() 方法所返回的鍵值列表中??梢允褂孟嗨频牟僮鳈z查某個值是否在調(diào)用 values() 方法所返回的數(shù)據(jù)值列表中。但是,可以使用 dictionary 名作為簡寫表示法。這是有意義的,因為一般希望知道某個數(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

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

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

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

相關(guān)文章

  • 基于Python_腳本CGI、特點(diǎn)、應(yīng)用、開發(fā)環(huán)境(詳解)

    基于Python_腳本CGI、特點(diǎn)、應(yīng)用、開發(fā)環(huán)境(詳解)

    下面小編就為大家?guī)硪黄赑ython_腳本CGI、特點(diǎn)、應(yīng)用、開發(fā)環(huán)境(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • python?open讀取文件內(nèi)容時的mode模式解析

    python?open讀取文件內(nèi)容時的mode模式解析

    這篇文章主要介紹了python?open讀取文件內(nèi)容時的mode模式解析,Python可以使用open函數(shù)來實(shí)現(xiàn)文件的打開,關(guān)閉,讀寫操作,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • python看某個模塊的版本方法

    python看某個模塊的版本方法

    今天小編就為大家分享一篇python看某個模塊的版本方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python探索之BaseHTTPServer-實(shí)現(xiàn)Web服務(wù)器介紹

    python探索之BaseHTTPServer-實(shí)現(xiàn)Web服務(wù)器介紹

    這篇文章主要介紹了python探索之BaseHTTPServer-實(shí)現(xiàn)Web服務(wù)器介紹,小編覺得還是挺不錯的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • pytorch?液態(tài)算法實(shí)現(xiàn)瘦臉效果

    pytorch?液態(tài)算法實(shí)現(xiàn)瘦臉效果

    在PS中,我們可以利用液化工具對人像進(jìn)行形變處理,例如瘦臉、瘦腿、放大眼睛等一系列的常規(guī)操作。今天我們來了解一下這些操作的算法原理,并用pytorch來實(shí)現(xiàn)瘦臉效果
    2021-11-11
  • Pycharm遠(yuǎn)程連接服務(wù)器并運(yùn)行與調(diào)試

    Pycharm遠(yuǎn)程連接服務(wù)器并運(yùn)行與調(diào)試

    本篇文章介紹一下 Pycharm 如何配置遠(yuǎn)程連接信息,使其能夠在本地使用服務(wù)器上的GPU等硬件資源,并在本地完成代碼的運(yùn)行與調(diào)試,感興趣的可以了解一下
    2021-08-08
  • PyTorch基本數(shù)據(jù)類型(一)

    PyTorch基本數(shù)據(jù)類型(一)

    這篇文章主要為大家詳細(xì)介紹了PyTorch基本數(shù)據(jù)類型,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Python抖音快手代碼舞(字符舞)的實(shí)現(xiàn)方法

    Python抖音快手代碼舞(字符舞)的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Python抖音快手代碼舞的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 淺析Python裝飾器以及裝飾器模式

    淺析Python裝飾器以及裝飾器模式

    本篇文章給大家分享了關(guān)于Python裝飾器以及裝飾器模式的相關(guān)知識點(diǎn),一起跟著小編學(xué)習(xí)下吧。
    2018-05-05
  • python讀取Windows注冊表的示例代碼

    python讀取Windows注冊表的示例代碼

    本文主要介紹了python讀取Windows注冊表的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評論