和列表相同,字典也是許多數據的集合,屬於可變序列類型。不一樣之處在於,它是無序的可變序列,其保存的內容是以「鍵值對」的形式存放的。java
字典中,習慣將各元素對應的索引稱爲鍵(key),各個鍵對應的元素稱爲值(value),鍵及其關聯的值稱爲「鍵值對」。
字典類型很像學生時代經常使用的新華字典。咱們知道,經過新華字典中的音節表,能夠快速找到想要查找的漢字。其中,字典裏的音節表就至關於字典類型中的鍵,而鍵對應的漢字則至關於值。python
主要特徵 | 解釋 |
---|---|
經過鍵而不是經過索引來讀取元素 | 字典類型有時也稱爲關聯數組或者散列表(hash)。它是經過鍵將一系列的值聯繫起來的,這樣就能夠經過鍵從字典中獲取指定項,但不能經過索引來獲取。 |
字典是任意數據類型的無序集合 | 和列表、元組不一樣,一般會將索引值 0 對應的元素稱爲第一個元素。而字典中的元素是無序的。 |
字典是可變的,而且能夠任意嵌套 | 字典能夠在原處增加或者縮短(無需生成一個副本),而且它支持任意深度的嵌套,即字典存儲的值也能夠是列表或其它的字典。 |
字典中的鍵必須惟一 | 字典中,不支持同一個鍵出現屢次,不然,只會保留最後一個鍵值對。 |
字典中的鍵必須不可變 | 字典中的值是不可變的,只能使用數字、字符串或者元組,不能使用列表。 |
Python 中的字典類型至關於 Java 或者 C++ 中的 Map 對象。數組
於字典中每一個元素都包含 2 部分,分別是鍵和值,所以在建立字典時,鍵和值之間使用冒號分隔,相鄰元素之間使用逗號分隔,全部元素放在大括號 {} 中。
Python 字典類型的語法格式以下:ssh
key: valuen 表示各個元素的鍵值對。須要注意的是,同一字典中各個元素的鍵值必須惟一。函數
dictname = {'key':'value1','key2':'value2',...,'keyn':valuen}
[root@kube dict]# cat demo.py #coding:utf-8 scores = {'語文':89,'數學':100,'化學':90} print(type(scores)) a_scores = {'語文':89,'數學':(44,55),'化學':[90,66]} #key 鍵不能是列表會報錯 print(a_scores) [root@kube dict]# py demo.py <class 'dict'> {'語文': 89, '數學': (44, 55), '化學': [90, 66]} [root@kube dict]#
Python 中,還可使用 dict 字典類型提供的 fromkeys() 方法建立全部鍵值爲空的字典,使用此方法的語法格式爲:ui
dictname = dict.fromkeys(list,value=None)
[root@kube dict]# cat demo1.py s_name = {'語文','數學','英語'} scores = dict.fromkeys(s_name) print(type(scores)) print(scores) [root@kube dict]# py demo1.py <class 'dict'> {'數學': None, '英語': None, '語文': None} [root@kube dict]#
經過 dict() 函數建立字典的寫法有多種,表 2 羅列出了經常使用的幾種方式,它們建立的都是同一個字典 a。spa
建立格式 | 注意事項 |
---|---|
>>> a = dict(one=1,two=2,three=3) | 注意,其中的 one、two、three 都是字符串,但使用此方式建立字典時,字符串不能帶引號。 |
>>> demo = [('two',2),('one',1),('three',3)] #方式1 >>> demo = [['two',2],['one',1],['three',3]] #方式2 >>> demo = (('two',2),('one',1),('three',3)) #方式3 >>> demo = (['two',2],['one',1],['three',3]) #方式4 >>> a = dict(demo) |
向 dict() 函數傳入列表或元組,而它們中的元素又各自是包含 2 個元素的列表或元組,其中第一個元素做爲鍵,第二個元素做爲值。 |
>>> demokeys = ['one','two','three'] #還能夠是字符串或元組 >>> demovalues = [1,2,3] #還能夠是字符串或元組 >>> a = dict(zip(demokeys,demovalues)) |
經過應用 dict() 函數和 zip() 函數,可將前兩個列表轉換爲對應的字典。 |
注意,不管採用以上哪一種方式建立字典,字典中各元素的鍵都只能是字符串、元組或數字,不能是列表。.net
和列表、元組不一樣,它們訪問元素都是經過下標,而字典不一樣,它是經過鍵來訪問對應的元素值。code
由於字典中元素是無序的,因此不能像列表、元組那樣,採用切片的方式一次性訪問多個元素。
Python 更推薦使用 dict 類型提供的 get() 方法獲取指定鍵的值。get() 方法的語法格式爲:orm
dict.get(key[,default])
[root@kube dict]# cat demo1.py scores = {'語文':60,'數學':70,'英語':80} print(scores.get('語文')) print(scores.get('英語')) #經過get 函數獲取值 del scores #del 刪除字典 print(scores) [root@kube dict]# py demo1.py 60 80 Traceback (most recent call last): File "demo1.py", line 5, in <module> print(scores) NameError: name 'scores' is not defined [root@kube dict]#
因爲字典屬於可變序列,因此咱們能夠任意操做字典中的鍵值對(key-value 對)。Python 中,常見的字典操做有如下幾種:
若是要爲 dict 添加鍵值對,只需爲不存在的 key 賦值便可。實現此操做的語法格式以下:
dict[key] = value
參數 | 含義 |
---|---|
dict | 表示字典名稱。 |
key | 表示要添加元素的鍵。注意,既然是添加新的元素,那麼就要保證此元素的鍵和字典中現有元素的鍵互不相同。 |
value | 表示要添加數據的值,只要是 Python 支持的數據類型就能夠。 |
[root@kube dict]# cat demo2.py a = dict() #用 duict 函數定義一個空的字典 print(a) print(type(a)) a['語文'] = 100 #定義字典中的 key 值並給定 value ,至關於字典添加鍵值對 a['數學'] = 80 a['地理'] = 90 print(a) a['語文'] = 88888 #給 相同key 從新賦值至關於修改 key 的value print(a) del a['地理'] #刪除對應的 key ,同時也刪除 key 對應的 value print(a) [root@kube dict]# py demo2.py {} <class 'dict'> {'語文': 100, '數學': 80, '地理': 90} {'語文': 88888, '數學': 80, '地理': 90} {'語文': 88888, '數學': 80} [root@kube dict]#
字典的數據類型爲 dict,咱們可以使用 dir(dict)
來查看該類包含哪些方法
>>> dir(dict) ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] >>>
這 3 個方法之因此放在一塊兒介紹,是由於它們都用來獲取字典中的特定數據。keys() 方法用於返回字典中的全部鍵;values() 方法用於返回字典中全部鍵對應的值;items() 用於返回字典中全部的鍵值對。
[root@kube dict]# cat demo3.py scores = {'語文':60,'數學':70,'英語':80} print(scores.keys()) print(scores.values()) print(scores.items()) [root@kube dict]# py demo3.py dict_keys(['語文', '數學', '英語']) dict_values([60, 70, 80]) dict_items([('語文', 60), ('數學', 70), ('英語', 80)]) [root@kube dict]#
[root@kube dict]# [root@kube dict]# cat demo4.py a = {'數學': 95, '語文': 89, '英語': 90} for k in a.keys(): print(k,end=' ') print("\n---------------") for v in a.values(): print(v,end=' ') print("\n---------------") for k,v in a.items(): print("key:",k," value:",v) [root@kube dict]# py demo4.py 數學 語文 英語 --------------- 95 89 90 --------------- key: 數學 value: 95 key: 語文 value: 89 key: 英語 value: 90 [root@kube dict]#
copy() 方法用於返回一個具備相同鍵值對的新字典
[root@kube dict]# cat demo5.py a = {'one':1,'two':2,'three':[3,2,1]} b = a.copy() print(b) [root@kube dict]# py demo5.py {'one': 1, 'two': 2, 'three': [3, 2, 1]} [root@kube dict]#
注意,copy() 方法所遵循的拷貝原理,既有深拷貝,也有淺拷貝。拿拷貝字典 a 爲例,copy() 方法只會對最表層的鍵值對進行深拷貝,也就是說,它會再申請一塊內存用來存放 {'one': 1, 'two': 2, 'three': []};而對於某些列表類型的值來講,此方法對其作的是淺拷貝,也就是說,b 中的 [1,2,3] 的值不是本身獨有,而是和 a 共有。
update() 方法可以使用一個字典所包含的鍵值對來更新己有的字典。
在執行 update() 方法時,若是被更新的字典中己包含對應的鍵值對,那麼原 value 會被覆蓋;若是被更新的字典中不包含對應的鍵值對,則該鍵值對被添加進去。
[root@kube dict]# cat demo6.py a = {'one':1,'two':2} a.update({'one':5.5,'three':3.3}) print(a) [root@kube dict]# py demo6.py {'one': 5.5, 'two': 2, 'three': 3.3} [root@kube dict]#
[root@kube dict]# cat demo7.py a = {'one': 1, 'two': 2, 'three': 3} print(a.pop('one')) print(a) [root@kube dict]# py demo7.py 1 {'two': 2, 'three': 3} [root@kube dict]#
popitem() 方法用於隨機彈出字典中的一個鍵值對。
注意,此處的隨機實際上是假的,它和 list.pop() 方法同樣,也是彈出字典中最後一個鍵值對。但因爲字典存儲鍵值對的順序是不可知的,所以 popitem() 方法老是彈出底層存儲的最後一個鍵值對。
[root@kube dict]# cat demo7.py a = {'one': 1, 'two': 2, 'three': 3} print(a.popitem()) print(a) print(a.popitem()) print(a) [root@kube dict]# py demo7.py ('three', 3) {'one': 1, 'two': 2} ('two', 2) {'one': 1} [root@kube dict]#
setdefault() 方法也用於根據 key 來獲取對應 value 的值。但該方法有一個額外的功能,即當程序要獲取的 key 在字典中不存在時,該方法會先爲這個不存在的 key 設置一個默認的 value,而後再返回該 key 對應的 value。
也就是說,setdefault() 方法總能返回指定 key 對應的 value;若是該鍵值對存在,則直接返回該 key 對應的 value;若是該鍵值對不存在,則先爲該 key 設置默認的 value,而後再返回該 key 對應的 value。
[root@kube dict]# cat demo7.py a = {'one': 1, 'two': 2, 'three': 3} print(a.setdefault('four')) #添加four 不存在的鍵,value默認 None print(a) print(a.setdefault('five',2.3)) #添加不存在的鍵值對,會添加 print(a) print(a.setdefault('one',5.5)) #添加已存在的鍵值,不會添加 print(a) [root@kube dict]# py demo7.py None {'one': 1, 'two': 2, 'three': 3, 'four': None} 2.3 {'one': 1, 'two': 2, 'three': 3, 'four': None, 'five': 2.3} 1 {'one': 1, 'two': 2, 'three': 3, 'four': None, 'five': 2.3} [root@kube dict]#
格式化字符串時,若是要格式化的字符串模板中包含多個變量,後面就須要按順序給出多個變量,這種方式對於字符串模板中包含少許變量的情形是合適的,但若是字符串模板中包含大量變量,這種按順序提供變量的方式則有些不合適。
這時,就可使用字典對字符串進行格式化輸出,具體方法是:在字符串模板中按 key 指定變量,而後經過字典爲字符串模板中的 key 設置值。
[root@kube dict]# cat demo8.py #coding:utf-8 #定義字符串模板的轉化說明符 temp = '姓名:%(name)s,年齡:%(age)3.0f,籍貫:%(location)s' msg = {'name': 'JoJ','age':23,'location':'海拉爾羣島'} print(temp % msg) [root@kube dict]# py demo8.py 姓名:JoJ,年齡: 23,籍貫:海拉爾羣島 [root@kube dict]#