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

6.1 字典

字典(dictionary)和列表類似,也是可變序列,不過與列表不同,它是無序的可變序列,保存的內容是以“鍵-值對”的形式存放的。這類似于《新華字典》,它可以把拼音和漢字關聯起來。通過音節表可以快速找到想要的漢字。其中,《新華字典》里的音節表相當于鍵(key),而對應的漢字相當于值(value)。鍵是唯一的,而值可以有多個。字典在定義一個包含多個命名字段的對象時,很有用。

說明

Python中的字典相當于Java或者C++中的Map對象。

字典的主要特征如下。

 通過鍵而不是通過索引來讀取

字典有時也稱為關聯數組或者散列表(hash)。它是通過鍵將一系列的值聯系起來的,這樣就可以通過鍵從字典中獲取指定項,但不能通過索引來獲取。

 字典是任意對象的無序集合

字典是無序的,各項是從左到右隨機排序的,即保存在字典中的項沒有特定的順序。這樣可以提高查找順序。

 字典是可變的,并且可以任意嵌套

字典可以在原處增長或者縮短(無須生成一份拷貝),并且它支持任意深度的嵌套(即它的值可以是列表或者其他的字典)。

 字典中的鍵必須唯一

不允許同一個鍵出現兩次,如果出現兩次,則后一個值會被記住。

 字典中的鍵必須不可變

字典中的鍵是不可變的,所以可以使用數字、字符串或者元組,但不能使用列表。

6.1.1 字典的創建和刪除

定義字典時,每個元素都包含兩個部分——“鍵”和“值”,并且在“鍵”和“值”之間使用冒號分隔,相鄰兩個元素使用逗號分隔,所有元素放在一個大括號“{}”中。語法格式如下:

    dictionary = {'key1':'value1', 'key2':'value2', ..., 'keyn':'valuen',}

參數說明如下:

 dictionary:表示字典名稱;

 key1, key2, ..., keyn:表示元素的鍵,必須是唯一的,并且不可變,例如可以是字符串、數字或者元組;

 value1, value2, ..., valuen:表示元素的值,可以是任何數據類型,不是必須唯一。

例如,創建一個保存通訊錄信息的字典,可以使用下面的代碼。

01  dictionary = {'qq':'84978981','明日科技':'84978982','無語':'0431-84978981'}
02  print(dictionary)

執行結果如下:

    {'qq': '84978981', '明日科技': '84978982', '無語': '0431-84978981'}

同列表和元組一樣,也可以創建空字典。在Python中,可以使用下面兩種方法創建空字典。

    dictionary = {}

或者

    dictionary = dict()

Python的dict()方法除了可以創建一個空字典外,還可以通過已有數據快速創建字典。主要表現為以下兩種形式。

1.通過映射函數創建字典

語法如下:

    dictionary = dict(zip(list1,list2))

參數說明如下:

 dictionary:表示字典名稱。

 zip()函數:用于將多個列表或元組對應位置的元素組合為元組,并返回包含這些內容的zip對象。如果想得到元組,可以將zip對象使用tuple()函數轉換為元組;如果想得到列表,則可以使用list()函數將其轉換為列表。

說明

在Python 2.x中,zip()函數返回的內容為包含元組的列表。

 list1:表示一個列表,用于指定要生成字典的鍵。

 list2:表示一個列表,用于指定要生成字典的值。如果list1和list2的長度不同,則與最短的列表長度相同。

場景模擬:某大學的寢室里住著4位清秀可人的美女,她們的名字保存在一個列表中,另外,她們每個人的星座對應著保存在另一個列表中。

【例6.1】 根據名字和星座創建一個字典。(實例位置:資源包\TM\sl\06\01)

在IDLE中創建一個名稱為sign_create.py的文件,然后在該文件中定義兩個包括4個元素的列表,再應用dict()函數和zip()函數將前兩個列表轉換為對應的字典,并且輸出該字典,代碼如下:

運行代碼后,將顯示如圖6.1所示的結果。

圖6.1 創建字典

2.通過給定的“鍵-值對”創建字典

語法如下:

    dictionary = dict(key1=value1,key2=value2,...,keyn=valuen)

參數說明如下:

 dictionary:表示字典名稱;

 key1, key2, ..., keyn:表示元素的鍵,必須是唯一的,并且不可變,例如可以是字符串、數字或者元組;

 value1, value2, ..., valuen:表示元素的值,可以是任何數據類型,不是必須唯一。

例如,將實例6.1中的名字和星座通過“鍵-值對”的形式創建一個字典,可以使用下面的代碼。

01  dictionary =dict(綺夢 = '水瓶座', 冷伊一 = '射手座', 香凝 = '雙魚座', 黛蘭 = '雙子座')
02  print(dictionary)

在Python中,還可以使用dict對象的fromkeys()方法創建值為空的字典,語法如下:

    dictionary = dict.fromkeys(list1)

參數說明如下:

 dictionary:表示字典名稱;

 list1:作為字典的鍵的列表。

例如,創建一個只包括名字的字典,可以使用下面的代碼。

執行結果如下。

    {'綺夢': None, '冷伊一': None, '香凝': None, '黛蘭': None}

另外,還可以通過已經存在的元組和列表創建字典。例如,創建一個保存名字的元組和保存星座的列表,通過它們創建一個字典,可以使用下面的代碼。

執行結果如下:

{('綺夢', '冷伊一', '香凝', '黛蘭'): ['水瓶座', '射手座', '雙魚座', '雙子座']}

如果將作為鍵的元組修改為列表,再創建一個字典,代碼如下:

執行結果如圖6.2所示。

圖6.2 將列表作為字典的鍵產生的異常

同列表和元組一樣,不再需要的字典也可以使用del命令刪除。例如,通過下面的代碼即可將已經定義的字典刪除。

    del dictionary

另外,如果只是想刪除字典的全部元素,可以使用字典對象的clear()方法。執行clear()方法后,原字典將變為空字典。例如,下面的代碼將清除字典的全部元素。

    dictionary.clear()

除了上面介紹的方法可以刪除字典元素,還可以使用字典對象的pop()刪除并返回指定“鍵”的元素,以及使用字典對象的popitem()方法刪除并返回字典中的一個元素。

6.1.2 訪問字典

在Python中,如果想將字典的內容輸出也比較簡單,可以直接使用print()函數。例如,要想打印實例6.1中定義的dictionary字典,則可以使用下面的代碼。

    print(dictionary)

執行結果如下:

    {'綺夢': '水瓶座', '冷伊一': '射手座', '香凝': '雙魚座', '黛蘭': '雙子座'}

但是,在使用字典時,很少直接輸出它的內容。一般需要根據指定的鍵得到相應的結果。在Python中,訪問字典的元素可以通過下標的方式實現,與列表和元組不同,這里的下標不是索引號,而是鍵。例如,想要獲取“冷伊一”的星座,可以使用下面的代碼。

    print(dictionary['冷伊一'])

執行結果如下:

    射手座

在使用該方法獲取指定鍵的值時,如果指定的鍵不存在,將拋出如圖6.3所示的異常。

圖6.3 獲取指定鍵不存在時拋出異常

在實際開發中,很可能我們不知道當前存在什么鍵,所以需要避免該異常的產生。具體的解決方法是使用if語句對不存在的情況進行處理,即給一個默認值。例如,可以將上面的代碼修改為以下內容。

    print("冷伊的星座是:",dictionary['冷伊'] if '冷伊' in dictionary else '我的字典里沒有此人')

當“冷伊”不存在時,將顯示以下內容。

    冷伊的星座是:我的字典里沒有此人

另外,Python中推薦的方法是使用字典對象的get()方法獲取指定鍵的值。其語法格式如下:

    dictionary.get(key[,default])

其中,dictionary為字典對象,即要從中獲取值的字典;key為指定的鍵;default為可選項,用于當指定的鍵不存在時,返回一個默認值,如果省略,則返回None。

例如,通過get()方法獲取“冷伊一”的星座,可以使用下面的代碼。

    print("冷伊一的星座是:",dictionary.get('冷伊一'))

執行結果如下。

    冷伊一的星座是: 射手座

說明

為了解決在獲取指定鍵的值時,因不存在該鍵而導致拋出異常,可以為get()方法設置默認值,這樣當指定的鍵不存在時,得到結果就是指定的默認值。例如,將上面的代碼修改為以下內容。

    print("冷伊的星座是:",dictionary.get('冷伊','我的字典里沒有此人'))

將得到以下結果。

    冷伊的星座是:我的字典里沒有此人

場景模擬:仍然是某大學寢室里的4位美女,這次將她們的名字和星座保存在一個字典里,然后再定義一個保存各個星座性格特點的字典,根據這兩個字典取出某位美女的性格特點。

【例6.2】 根據星座測試性格特點。(實例位置:資源包\TM\sl\06\02)

在IDLE中創建一個名稱為sign_get.py的文件,然后在該文件中創建兩個字典,一個保存名字和星座,另一個保存星座和性格特點,最后從這兩個字典中取出相應的信息組合出想要的結果,并輸出,代碼如下:

運行代碼后,將顯示如圖6.4所示的結果。

圖6.4 輸出某人的星座和性格特點

6.1.3 遍歷字典

字典是以“鍵-值對”的形式存儲數據的,所以就可能需要對這些“鍵-值對”進行獲取。Python提供了遍歷字典的方法,通過遍歷可以獲取字典中的全部“鍵-值對”。

使用字典對象的items()方法可以獲取字典的“鍵-值對”列表。其語法格式如下:

    dictionary.items()

其中,dictionary為字典對象;返回值為可遍歷的“鍵-值對”元組列表。想要獲取到具體的“鍵-值對”,可以通過for循環遍歷該元組列表。

例如,定義一個字典,然后通過items()方法獲取“鍵-值對”的元組列表,并輸出全部“鍵-值對”,代碼如下:

01  dictionary = {'qq':'84978981','明日科技':'84978982','無語':'0431-84978981'}
02  for item in dictionary.items():
03      print(item)

執行結果如下:

    ('qq', '84978981')
    ('明日科技', '84978982')
    ('無語', '0431-84978981')

上面的示例得到的是元組中的各個元素,如果想要獲取到具體的每個鍵和值,可以使用下面的代碼進行遍歷。

01  dictionary = {'qq':'4006751066','明日科技':'0431-84978982','無語':'0431-84978981'}
02  for key,value in dictionary.items():
03      print(key,"的聯系電話是",value)

執行結果如下:

    qq的聯系電話是 4006751066
    明日科技 的聯系電話是 0431-84978982
    無語 的聯系電話是 0431-84978981

說明

在Python中,字典對象還提供了values()和keys()方法,用于返回字典的“值”和“鍵”列表,它們的使用方法同items()方法類似,也需要通過for循環遍歷該字典列表,獲取對應的值和鍵。

6.1.4 添加、修改和刪除字典元素

由于字典是可變序列,所以可以隨時在其中添加“鍵-值對”,這和列表類似。向字典中添加元素的語法格式如下:

    dictionary[key] = value

參數說明如下:

 dictionary:表示字典名稱;

 key:表示要添加元素的鍵,必須是唯一的,并且不可變,例如可以是字符串、數字或者元組;

 value:表示元素的值,可以是任何數據類型,不是必須唯一。

例如,還是以之前的保存4位美女星座的場景為例,在創建的字典中添加一個元素,并顯示添加后的字典,代碼如下:

01  dictionary =dict((('綺夢', '水瓶座'),('冷伊一','射手座'), ('香凝','雙魚座'), ('黛蘭','雙子座')))
02  dictionary["碧琦"] = "巨蟹座"   # 添加一個元素
03  print(dictionary)

執行結果如下:

{'綺夢': '水瓶座', '冷伊一': '射手座', '香凝': '雙魚座', '黛蘭': '雙子座', '碧琦': '巨蟹座'}

從上面的結果中,可以看出又添加了一個鍵為“碧琦”的元素。

由于在字典中,“鍵”必須是唯一的,所以如果新添加元素的“鍵”與已經存在的“鍵”重復,那么將使用新的“值”替換原來該“鍵”的值,這也相當于修改字典的元素。例如,再添加一個“鍵”為“香凝”的元素,這次設置她為“天蝎座”。可以使用下面的代碼。

01  dictionary =dict((('綺夢', '水瓶座'),('冷伊一','射手座'), ('香凝','雙魚座'), ('黛蘭','雙子座')))
02  dictionary["香凝"] = "天蝎座"   # 添加一個元素,當元素存在時,則相當于修改功能
03  print(dictionary)

執行結果如下:

    {'綺夢': '水瓶座', '冷伊一': '射手座', '香凝': '天蝎座', '黛蘭': '雙子座'}

從上面的結果可以看出,并沒有添加一個新的“鍵”為“香凝”的元素,而是直接對“香凝”進行了修改。

當字典中的某個元素不需要時,可以使用del命令將其刪除。例如,要刪除字典dictionary的鍵為“香凝”的元素,可以使用下面的代碼。

01  dictionary =dict((('綺夢', '水瓶座'),('冷伊一','射手座'), ('香凝','雙魚座'), ('黛蘭','雙子座')))
02  del dictionary["香凝"]    # 刪除一個元素
03  print(dictionary)

執行結果如下:

    {'綺夢': '水瓶座', '冷伊一': '射手座', '黛蘭': '雙子座'}

從上面的執行結果中可以看到,在字典dictionary中只剩下3個元素了。

注意

當刪除一個不存在的鍵時,將拋出如圖6.5所示的異常。

圖6.5 刪除一個不存在的鍵時將拋出的異常

因此,需要將上面的代碼修改為以下內容,從而防止刪除不存在的元素時拋出異常。

6.1.5 字典推導式

使用字典推導式可以快速生成一個字典,它的表現形式和列表推導式類似。例如,我們可以使用下面的代碼生成一個包含4個隨機數的字典,其中字典的鍵使用數字表示。

執行結果如下:

    生成的字典為: {1: 21, 2: 85, 3: 11, 4: 65}

另外,使用字典推導式也可根據列表生成字典。例如,可以將實例6.2修改為通過字典推導式生成字典。

【例6.3】 根據名字和星座創建一個字典(副本)。(實例位置:資源包\TM\sl\06\03)

在IDLE中創建一個名稱為sign_create.py的文件,然后在該文件中定義兩個包括4個元素的列表,再應用dict()函數和zip()函數將兩個列表轉換為對應的字典,并且輸出該字典,代碼如下:

運行代碼后,將顯示如圖6.6所示的結果。

圖6.6 采用字典推導式創建字典

主站蜘蛛池模板: 渝中区| 防城港市| 普安县| 汉中市| 海丰县| 西乡县| 郧西县| 墨脱县| 太和县| 红桥区| 平邑县| 湖州市| 建昌县| 沂水县| 博爱县| 班玛县| 乐安县| 罗平县| 体育| 彝良县| 新和县| 泸西县| 澜沧| 清苑县| 涿州市| 宕昌县| 建宁县| 闻喜县| 龙游县| 通榆县| 北宁市| 凉城县| 克东县| 奉新县| 辽宁省| 通化市| 洛扎县| 永安市| 通江县| 道真| 广东省|