????“字典”是Python語言中最重要的三種數據類型(字符串、列表、字典)之一,它的用處很多,本身的功能也很強大。實際上,三種最基本的數據類型用途都很廣泛,功能都很強大。但Python字典不同于其它兩種類型的是,它通過名稱而不是索引來訪問其中的各個值。其是一種可以稱為“映射”的數據結構,也是Python中唯一的內置映射類型。
????“字典”的名稱即指出了這種數據結構的用途。普通圖書適合按照從頭到尾的順序閱讀,當然,如果我們愿意,也可快速翻到想要的某一頁,這有點像Python中的列表。日常生活中的字典通常作為工具書來用,能夠讓我們輕松地找到特定的單詞,以獲悉單詞的定義。Python字典能夠幫助我們快速地找到想要的“鍵”,從而獲得其相應的“值”。
????Python字典的“鍵”和“值”都可能包含有用的信息。它們都可以用來做文章。要定義一個字典,通常有兩種方式。
? ? 第一種是直接定義:
通過d = {key1: 值1, key2: 值2, ...}
比如:phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
????字典的基本元素稱為鍵值對(key-value對),也可以稱為“項”(item)。每個項(鍵值對)使用冒號(:)分割鍵和值,每項之間使用逗號(,)分割,整個字典包括在花括號({})中。其中的鍵(key)和值(value)一一映射,一一對應。
????第二種是通過dict()函數來定義:
????函數dict()能夠接收具備映射性質的實參來創建字典
????a.接收關鍵字實參
????比如:d = dict(name='David', age=25)
>>> d = {'name': 'David', 'age': 25}
????b.接收類似[(a1, b1), (a2, b2), ...]的實參
例:d = dict([('name', 'David'), ('age', 25)])將創建與上個例子相同的字典
>>> d = {'name': 'David', 'age': 25}
????像函數list、tuple和str一樣,如果調用dict()函數時沒有提供任何實參,將返回一個空字典。即dict()={}。
????需要注意的是,雖然字典基本能夠容納任何類型的數據,但只是針對它的“值”而言的。字典的“鍵”必須是不可變類型的數據,比如:字符串,元組,數,而不能是:列表,字典或其他可變類型的數據。
????還有一點,因為字典是通過“鍵”訪問其中的“值”,所以鍵必須是唯一的。否則,計算機會覺得混亂,不知道我們想要哪個值。并且字典中的項是無序的,因為已經有“鍵”了,我們無需再通過順序來標識其中的項。不必像列表、元組和字符串一樣使用索引為它們所包含的元素排序。
????字典的很多基本操作類似于其他序列,大致包含如下:
????1)len(d)返回字典d包含的項(鍵-值對)數
????2)d[k]返回與鍵k相關聯的值
????3)d[k] = v將值v關聯到鍵k
????4)del d[k]刪除鍵為k的項
????5)k in d檢查字典d是否包含鍵為k的項
????方法2)中是根據字典中已經存在的鍵獲取其關聯的值;方法3)是將新值v賦值給字典中不存在的鍵或者是已經存在的鍵,如果鍵存在新值v覆蓋原有的值,如果鍵不存在就創建一個新的鍵-值對。
????Python字典內置有很多方法,可以使用它們來操作字典,獲得我們想要的結果。
????1)clear
作用:刪除字典中的所有項
返回值:該方法沒有返回值,或者說返回None
用法:d.clear()
例:
>>> d = {'name': 'David', 'age': 25}
>>> return_value = d.clear()
>>> d
{}
>>> return_value
None
????2)get
作用:get方法也能夠根據鍵獲得值,但比d[key]的方式取值更好用,后一種方法只適用于鍵存在時(否則會拋出異常),而get方法不會如此(鍵不存在時返回None)
用法:value = d.get(key)
例:
>>> d = {'name': 'David', 'age': 25}
>>> d.get('name')
'David'
>>> d.get('phone')
None
#【也可以設置鍵不存在時的返回值(如果不設置,即默認為None)】
>>> d.get('phone',119)
119
PS:在編寫取字典值的代碼時,使用此方法,我們將會體驗到它的好用。
????3)items
作用:返回一個包含所有字典項的列表,其中每個元素都為(key, value)的形式。
返回值:items方法返回的是一個“字典視圖”,dict_items(), 里面包含的即是返
? ? ? 回一個包含所有字典項的列表。
用法:t = d.items()
例:
>>> d = {'name': 'David', 'age': 25}
>>> t = d.items()
>>> t
dict_items([('name', 'David'), ('age', 25)])
PS:dict_items()是一種名為字典視圖的特殊類型,可用于迭代,可用于成員資格
檢查,可使用len(t)。但是不能當做正常的字典來用,比如:不能t['name'],不能
t[0]。并且它始終是底層字典的反映,t會跟隨字典d的變化而變化。
????4)keys
作用:返回一個包含所有字典key的列表,也屬于“字典視圖”,為dict_keys()。
例:
>>> d = {'name': 'David', 'age': 25}
>>> t = d.keys()
>>> t
dict_keys(['name', 'age'])
PS:其他跟items方法類似。
????5)values
作用:返回一個包含所有字典value的列表,也屬于“字典視圖”,為dict_values()。
例:
>>> d = {'name': 'David', 'age': 25}
>>> t = d.values()
>>> t
dict_values(['David', 25])
PS:其他跟items方法類似。
????6)pop
作用:用于獲取與指定鍵相關聯的值,并將該鍵-值對從字典中刪除。需要注意的是,當指定的鍵不存在時,會拋異常。
用法:value = d.pop(key)
例:
>>> d = {'name': 'David', 'age': 25}
>>> val = d.pop('age')
>>> val
25
>>> d
{'name': 'David'}
????7)popitem
作用:類似于list.pop,但list.pop彈出列表中的最后一個元素,而popitem彈出出一個字典項。但由于字典是無序的。最好使用OrderedDict來使用此方法。
返回值:彈出的字典項的元組形式。
用法:tur = d.popitem()
例:
>>> d = {'name': 'David', 'age': 25}
>>> d.popitem()
('age', 25)
>>> d
{'name': 'David'}
PS:OrderedDict是屬于“有序字典”類型,
? ? 形式為OrderedDict([('name', 'David'), ('age', 25)]),基本可以像操
? ? 作普通字典一樣操作它,但它其中的元素是有序的。
????8)setdefault
作用:方法setdefault有點像get,因為它也獲取與指定鍵相關聯的值,但除此之外,setdefault 還在字典不包含指定的鍵時,在字典中添加指定的鍵-值對。
用法:value = d.setdefault(key)
例:
>>> d = {'name': 'David', 'age': 25}
>>> val = d.setdefault('phone', 119)
>>> val
119
>>> d
{'name': 'David', 'age': 25, 'phone': 119}
>>> d = {'name': 'David', 'age': 25}
>>> val = d.setdefault('age', 18)
>>> val
25
>>> d
{'name': 'David', 'age': 25}
????9)update
作用:使用一個字典中的項來更新另一個字典。原字典中已經存在該項時,就替換;不存在就創建。
用法:d.update(d1)
例:
>>> d = {'name': 'David', 'age': 25}
>>> d.update({'phone': 119})
>>> d
{'name': 'David', 'age': 25, 'phone': 119}
>>> d.update({'name': 'Alice'})
>>> d
{'name': 'Alice', 'age': 25, 'phone': 119}
>>> d.update(age=18)
>>> d
{'name': 'Alice', 'age': 18, 'phone': 119}
????Python字典的方法不止這些,上述所列只是比較常用的。
關于字典無序的補充說明:
????Python字典中的項無序在python2.x版本中能夠容易的體現到。在python3.x中,Python字典會按照其中項的創建順序為它們排位,即它們有初始順序。但我們無法對這初始排序做些什么。下面的實例能夠體現Python字典的無序性:
>>> d1 = {'name': 'David', 'age': 25}
>>> d2 = {'age': 25, 'name': 'David'}
>>> d1 == d2
True
????而對于OrderedDict有序字典,上述測驗的結果為“False”
>>> from collections import OrderedDict
>>> d1 = OrderedDict([('name', 'David'), ('age', 25)])
>>> d1
OrderedDict([('name', 'David'), ('age', 25)])
>>> d2 = OrderedDict([('age', 25), ('name', 'David')])
>>> d1 == d2
False
參考書籍:
《Python基礎教程(第三版)》 ---作者:Magnus Lie Hetland?著,袁國忠?譯
鏈接:百度云盤
提取碼:7r7o