Time will tell.

前言
迄今為止,我們已經為大家介紹了Python中的三種容器型資料型別,但是這些資料型別還不足以幫助我們解決所有的問題,例如,我們要保存一個人的資訊,包括姓名、年齡、體重、單位地址、家庭住址、本人手機號、緊急聯系人手機號等資訊,你會發現我們之前學過的串列、元組和集合都不是最理想的選擇,
person1 = [‘王大錘’, 55, 60, ‘科華北路62號’, ‘中同仁路8號’, ‘13122334455’, ‘13800998877’]
person2 = (‘王大錘’, 55, 60, ‘科華北路62號’, ‘中同仁路8號’, ‘13122334455’, ‘13800998877’)
person3 = {‘王大錘’, 55, 60, ‘科華北路62號’, ‘中同仁路8號’, ‘13122334455’, ‘13800998877’}
集合肯定是最不合適的,因為集合有去重特性,如果一個人的年齡和體重相同,那么集合中就會少一項資訊;同理,如果這個人的家庭住址和單位地址是相同的,那么集合中又會少一項資訊,另一方面,雖然串列和元組可以把一個人的所有資訊都保存下來,但是當你想要獲取這個人的手機號時,你得先知道他的手機號是串列或元組中的第6個還是第7個元素;當你想獲取一個人的家庭住址時,你還得知道家庭住址是串列或元組中的第幾項,總之,在遇到上述的場景時,串列、元組、字典都不是最合適的選擇,我們還需字典(dictionary)型別,這種資料型別最適合把相關聯的資訊組裝到一起,并且可以幫助我們解決程式中為真實事物建模的問題,
Python程式中的字典跟現實生活中的字典很像,它以鍵值對(鍵和值的組合)的方式把資料組織到一起,我們可以通過鍵找到與之對應的值并進行操作,就像《新華字典》中,每個字(鍵)都有與它對應的解釋(值)一樣,每個字和它的解釋合在一起就是字典中的一個條目,而字典中通常包含了很多個這樣的條目,
創建和使用字典
在Python中創建字典可以使用{}字面量語法,這一點跟上一節課講的集合是一樣的,但是字典的{}中的元素是以鍵值對的形式存在的,每個元素由:分隔的兩個值構成,:前面是鍵,:后面是值,代碼如下所示,
xinhua = { '麓': '山腳下', '路': '道,往來通行的地方;方面,地區:南~貨,外~貨;種類:他倆是一~人', '蕗': '甘草的別名', '潞': '潞水,水名,即今山西省的濁漳河;潞江,水名,即云南省的怒江' } print(xinhua) person = { 'name': '王大錘', 'age': 55, 'weight': 60, 'office': '科華北路62號', 'home': '中同仁路8號', 'tel': '13122334455', 'econtact': '13800998877' } print(person)
通過上面的代碼,相信大家已經看出來了,用字典來保存一個人的資訊遠遠優于使用串列或元組,因為我們可以用:前面的鍵來表示條目的含義,而:后面就是這個條目所對應的值,
當然,如果愿意,我們也可以使用內置函式dict或者是字典的生成式語法來創建字典,代碼如下所示,
# dict函式(構造器)中的每一組引數就是字典中的一組鍵值對 person = dict(name='王大錘', age=55, weight=60, home='中同仁路8號') print(person) # {'name': '王大錘', 'age': 55, 'weight': 60, 'home': '中同仁路8號'} # 可以通過Python內置函式zip壓縮兩個序列并創建字典 items1 = dict(zip('ABCDE', '12345')) print(items1) # {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5'} items2 = dict(zip('ABCDE', range(1, 10))) print(items2) # {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5} # 用字典生成式語法創建字典 items3 = {x: x ** 3 for x in range(1, 6)} print(items3) # {1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
想知道字典中一共有多少組鍵值對,仍然是使用len函式;如果想對字典進行遍歷,可以用for回圈,但是需要注意,for回圈只是對字典的鍵進行了遍歷,不過沒關系,在講完字典的運算后,我們可以通過字典的鍵獲取到和這個鍵對應的值,
person = {'name': '王大錘', 'age': 55, 'weight': 60, 'office': '科華北路62號'}
print(len(person)) # 4
for key in person:
print(key)
字典的運算
對于字典型別來說,成員運算和索引運算肯定是最為重要的,前者可以判定指定的鍵在不在字典中,后者可以通過鍵獲取對應的值或者向字典中加入新的鍵值對,
值得注意的是,字典的索引不同于串列的索引,串列中的元素因為有屬于自己有序號,所以串列的索引是一個整數;字典中因為保存的是鍵值對,所以字典的索引是鍵值對中的鍵,通過索引操作可以修改原來的值或者向字典中存入新的鍵值對,
特別提醒大家注意的是,字典中的鍵必須是不可變型別,例如整數(int)、浮點數(float)、字串(str)、元組(tuple)等型別的值;顯然,串列(list)和集合(set)是不能作為字典中的鍵的,當然字典型別本身也不能再作為字典中的鍵,因為字典也是可變型別,但是字典可以作為字典中的值,關于可變型別不能作為字典中的鍵的原因,我們在后面的課程中再為大家詳細說明,
這里,我們先看看下面的代碼,了解一下字典的成員運算和索引運算,
person = {'name': '王大錘', 'age': 55, 'weight': 60, 'office': '科華北路62號'}
# 檢查name和tel兩個鍵在不在person字典中
print('name' in person, 'tel' in person) # True False
# 通過age修將person字典中對應的值修改為25
if 'age' in person:
person['age'] = 25
# 通過索引操作向person字典中存入新的鍵值對
person['tel'] = '13122334455'
person['signature'] = '你的男朋友是一個蓋世垃圾,他會踏著五彩祥云去贏取你的閨蜜'
print('name' in person, 'tel' in person) # True True
# 檢查person字典中鍵值對的數量
print(len(person)) # 6
# 對字典的鍵進行回圈并通索引運算獲取鍵對應的值
for key in person:
print(f'{key}: {person[key]}')
需要注意,在通過索引運算獲取字典中的值時,如指定的鍵沒有在字典中,將會引發KeyError例外,
字典的方法
字典型別的方法基本上都跟字典的鍵值對操作相關,可以通過下面的例子來了解這些方法的使用,例如,我們要用一個字典來保存學生的資訊,我們可以使用學生的學號作為字典中的鍵,通過學號做索引運算就可以得到對應的學生;我們可以把字典中鍵對應的值也做成一個字典,這樣就可以用多組鍵值對分別存盤學生的姓名、性別、年齡、籍貫等資訊,代碼如下所示,
# 字典中的值又是一個字典(嵌套的字典) students = { 1001: {'name': '狄仁杰', 'sex': True, 'age': 22, 'place': '山西大同'}, 1002: {'name': '白元芳', 'sex': True, 'age': 23, 'place': '河北保定'}, 1003: {'name': '武則天', 'sex': False, 'age': 20, 'place': '四川廣元'} } # 使用get方法通過鍵獲取對應的值,如果取不到不會引發KeyError例外而是回傳None或設定的默認值 print(students.get(1002)) # {'name': '白元芳', 'sex': True, 'age': 23, 'place': '河北保定'} print(students.get(1005)) # None print(students.get(1005, {'name': '無名氏'})) # {'name': '無名氏'} # 獲取字典中所有的鍵 print(students.keys()) # dict_keys([1001, 1002, 1003]) # 獲取字典中所有的值 print(students.values()) # dict_values([{...}, {...}, {...}]) # 獲取字典中所有的鍵值對 print(students.items()) # dict_items([(1001, {...}), (1002, {....}), (1003, {...})]) # 對字典中所有的鍵值對進行回圈遍歷 for key, value in students.items(): print(key, '--->', value) # 使用pop方法通過鍵洗掉對應的鍵值對并回傳該值 stu1 = students.pop(1002) print(stu1) # {'name': '白元芳', 'sex': True, 'age': 23, 'place': '河北保定'} print(len(students)) # 2 # stu2 = students.pop(1005) # KeyError: 1005 stu2 = students.pop(1005, {}) print(stu2) # {} # 使用popitem方法洗掉字典中最后一組鍵值對并回傳對應的二元組 # 如果字典中沒有元素,呼叫該方法將引發KeyError例外 key, value = students.popitem() print(key, value) # 1003 {'name': '武則天', 'sex': False, 'age': 20, 'place': '四川廣元'} # setdefault可以更新字典中的鍵對應的值或向字典中存入新的鍵值對 # setdefault方法的第一個引數是鍵,第二個引數是鍵對應的值 # 如果這個鍵在字典中存在,更新這個鍵之后會回傳原來與這個鍵對應的值 # 如果這個鍵在字典中不存在,方法將回傳第二個引數的值,默認為None result = students.setdefault(1005, {'name': '方啟鶴', 'sex': True}) print(result) # {'name': '方啟鶴', 'sex': True} print(students) # {1001: {...}, 1005: {...}} # 使用update更新字典元素,相同的鍵會用新值覆寫掉舊值,不同的鍵會添加到字典中 others = { 1005: {'name': '喬峰', 'sex': True, 'age': 32, 'place': '北京大興'}, 1010: {'name': '王語嫣', 'sex': False, 'age': 19}, 1008: {'name': '鐘靈', 'sex': False} } students.update(others) print(students) # {1001: {...}, 1005: {...}, 1010: {...}, 1008: {...}}
