官术网_书友最值得收藏!

5.2 創建和使用字典

字典的創建格式如下:

        >>> d = {key1 : value1, key2 : value2 }

字典由多個鍵及其對應的值構成的對組成(把鍵/值對稱為項)。字典的每個鍵/值(key/value)對用冒號(:)分割,每個項之間用逗號(,)分割,整個字典包括在花括號({})中。空字典(不包括任何項)由兩個大括號組成,如{}。

鍵必須是唯一的,但值不必。值可以取任何數據類型,鍵必須是不可變的,如字符串、數字或元組。

下面是一個簡單的字典示例:

        >>> dict = {’小萌’: '1001', ’小智’: '1002', ’小強’: '1003'}

也可以為如下形式:

        >>> dict1 = { 'abc': 456 }
        >>> dict2 = { 'abc': 123, 98.6: 37 }

5.2.1 dict函數

可以用dict函數,通過其他映射(如其他字典)或鍵/值序列對建立字典,例如:

        >>> student=[('name', ’小萌’), ('number', '1001')]
        >>> detail=dict(student)
        >>> print(’學生詳細信息:', detail)
        學生詳細信息: {'name':’小萌’,'number':'1001'}
        >>> print(’學生姓名:', detail['name'])
        學生姓名: 小萌
        >>> print(’學生學號:', detail['number'])
        學生學號: 1001

由輸出結果看到,dict函數可以將序列轉換為字典。字典的操作很簡單,在5.1節期望的功能已經實現了。

dict函數可以通過關鍵字參數創建字典,例如:

        >>> detail=dict(name=’小智’, number='1002')
        >>> print(’學生詳細信息:', detail)
        學生詳細信息: {'name':’小智’,'number':'1002'}

由輸出結果看到,通過關鍵字參數創建了字典。

通過關鍵字創建字典功能是dict函數非常有用的一個功能,可以多加運用。

5.2.2 字典的基本操作

字典的基本操作在很多方面與序列(sequence)類似,支持修改、刪除等操作。下面進行具體的講解。

1.修改字典

向字典添加新內容的方法是增加新鍵/值對,修改或刪除已有鍵/值對,例如:

        >>> student={’小萌’:'1001', ’小智’:'1002', ’小強’:'1003'}
        >>>student[’小強’]='1005'  #更新小強的學號
        >>> print(’小強的學號是:%(小強)s' % student)
        小強的學號是:1005
        >>> student[’小張’]='1006' #添加一個學生
        >>>print(’小張的學號是:%(小張)s'% student)
        小張的學號是:1006

由輸出結果看到,修改和添加均操作成功。

2.刪除字典元素

此處的刪除指的是顯式刪除,顯式刪除一個字典用del命令,例如:

        >>> student={’小強’: '1005', ’小萌’: '1001', ’小智’: '1002', ’小張’: '1006'}
        >>> print(’刪除前:', student)
        刪除前: {’小強’: '1005', ’小萌’: '1001', ’小智’: '1002', ’小張’: '1006'}
        >>> del student[’小張’] #刪除鍵“小張”
        >>> print(’刪除后:', student)
        刪除后: {’小強’: '1005', ’小萌’: '1001', ’小智’: '1002'}

由輸出結果看到對應鍵/值被正確刪除了。

除了刪除鍵,還可以刪除整個字典,例如:

        >>> student={’小強’: '1005', ’小萌’: '1001', ’小智’: '1002', ’小張’: '1006'}
        >>> print(’刪除前:', student)
        刪除前: {’小強’: '1005', ’小萌’: '1001', ’小智’: '1002', ’小張’: '1006'}
        >>>del student  #刪除字典
        >>> print(’刪除后:', student)
        Traceback (most recent call last):
          File "<pyshell#70>", line 1, in <module>
            print(’刪除后:', student)
        NameError: name 'student' is not defined

由輸出結果看到,刪除字典后就不能對字典進行訪問了,因為執行del操作后字典就不存在了,因而會報變量沒有定義的錯誤。

3.字典鍵的特性

字典值可以沒有限制地取任何Python對象,既可以是標準對象,也可以是用戶定義的對象,但鍵不行。

需要記住以下兩點:

(1)不允許同一個鍵出現兩次。創建時如果同一個鍵被賦值兩次,后面的值會被記住,例如:

        >>> student={’小萌’: '1001', ’小智’: '1002', ’小萌’: '1005'}
        >>> print(’學生信息:', student)
        學生信息: {’小萌’:'1005',’小智’:'1002'}

由輸出結果看到,一個鍵被賦值兩次,后面的值會被記住。(2)鍵必須不可變,可以用數字、字符串或元組充當,不能用列表,例如:

        >>> field={['name']:’小萌’, 'number':'1001'}
        Traceback (most recent call last):
          File "<pyshell#80>", line 1, in <module>
            field={['name']:’小萌’, 'number':'1001'}
        TypeError: unhashable type: 'list'

由輸出結果看到,不能用列表做鍵,會提示類型錯誤。

4. len函數

len(dict)函數用于計算字典元素的個數,即鍵的總數,例如:

        >>> student={’小萌’: '1001', ’小智’: '1002', ’小強’: '1005', ’小張’: '1006'}
        >>> print(’字典元素個數為:%d個’ % len(student))
        字典元素個數為:4個

輸出結果得到字典元素的個數為4。

5. type函數

type(variable)函數返回輸入的變量類型,如果輸入變量是字典就返回字典類型,例如:

        >>> student={’小萌’: '1001', ’小智’: '1002', ’小強’: '1005', ’小張’: '1006'}
        >>> print(’字典的類型為:', type(student))
        字典的類型為: <class'dict'>

輸出結果為字典(dict)類型。

5.2.3 字典的格式化字符串

在第4章我們已經見過如何使用字符串格式化功能格式化元組中的所有值。如果使用字典(只以字符串作為鍵)而不是元組做這項工作,會使字符串格式化更有趣一些,例如:

        >>> student={’小萌’:'1001', ’小智’:'1002', ’小強’:'1003'}
        >>> print(’小強的學號是:%(小強)s' % student)
        小強的學號是:1003

由操作結果看到,字典的格式化方式是在每個轉換說明符中的%字符后加上用圓括號括起來的鍵,再跟上其他說明元素。

字典的格式化除了增加字符串鍵外,轉換說明符還像以前一樣工作。以這種方式使用字典時,只要所有給出的鍵都能在字典中找到,就可以獲得任意數量的轉換說明符。

5.2.4 字典和列表的區別

例如,以一個名字查找對應的學號。

如果用list實現,就要先在名字列表中找到對應的名字,再從學號列表取出對應的學號,list越長耗時越長。如果用dict實現,只需要一個名字和學號的對照表,就可以直接根據名字查找學號,無論這個表有多大,查找速度都不會變慢。

為什么dict查找速度這么快?

因為dict的實現原理和查字典一樣。假設字典包含10000個漢字,我們要查某一個字,一種方法是把字典從第一頁往后翻,直到找到我們想要的字為止,這種方法是在list中查找元素,list越大查找越慢。另一種方法是在字典的索引表里(如部首表)查這個字對應的頁碼,然后直接翻到該頁找到這個字。無論找哪個字,這種查找速度都非常快,不會隨著字典大小的增加而變慢。

dict就是第二種實現方法,給定一個名字,比如我們要查找5.2.3小節示例中“小萌”的學號,在dict內部就可以直接計算出“小萌”存放學號的“頁碼”,也就是1001存放的內存地址,直接取出來即可,所以速度非常快。

綜上所述,list和dict各有以下幾個特點:

dict的特點是:

(1)查找和插入的速度極快,不會隨著key的增加而變慢。

(2)需要占用大量內存,內存浪費多。

list的特點是:

(1)查找和插入時間隨著元素的增加而增加。

(2)占用空間小,浪費內存很少。

所以,dict是使用空間換取時間。

dict可以用在很多需要高速查找的地方,在Python代碼中幾乎無處不在,正確使用dict非常重要,需要牢記dict的鍵必須是不可變對象。

注意 dict內部存放的順序和鍵放入的順序沒有關系。

主站蜘蛛池模板: 荃湾区| 泗阳县| 怀柔区| 晋宁县| 兴山县| 庆阳市| 依安县| 临桂县| 桐柏县| 化州市| 韩城市| 万盛区| 桑植县| 宣汉县| 海南省| 邳州市| 修武县| 德化县| 达日县| 西林县| 永胜县| 芒康县| 鄂托克旗| 宿迁市| 察隅县| 海门市| 邓州市| 古丈县| 佛山市| 云南省| 金坛市| 宣汉县| 双桥区| 五华县| 桂平市| 惠安县| 烟台市| 文化| 新乡县| 错那县| 宁阳县|