文章目錄
- 定義
- 操作
-
- 通路及修改
- 長度len()
- 查找及删除
- 字元串格式化輸出
- 字典的函數
-
- copy和deepcopy
- clear清除
- get和setdefult
-
- get()
- setdefault()
- items, keys, values
- pop和popitem
- update
字典是另一種可變容器模型,且可存儲任意類型對象。
定義
字典的每個鍵值(key=>value)對用冒号(:)分割,每個對之間用逗号(,)分割,整個字典包括在花括号({})中 。其中鍵值是唯一的,不能重複。值格式如下所示:
#建立方法一 直接建立
>>> dic={'zhangsan':'S001','lisi':'S002','wangwu':'S003'}
>>> dic
{'zhangsan': 'S001', 'lisi': 'S002', 'wangwu': 'S003'}
#建立方法二 利用元祖/清單
>>> dic=(['zhangsan','S001'],['lisi','S002'])
>>> dict(dic)
{'zhangsan': 'S001', 'lisi': 'S002'}
#或者用這樣的方法
>>> dic=dict(name='zhangsan',age=23)
>>> dic
{'name': 'zhangsan', 'age': 23}
#建立方法三 使用fromkeys
>>> help(dict.fromkeys)
Help on built-in function fromkeys:
fromkeys(iterable, value=None, /) method of builtins.type instance
Create a new dictionary with keys from iterable and values set to value.
# 可以看到使用formkeys可以批量建立不同keys單值一樣的字典,其中的疊代器可以是清單也以是元組。
>>> dic={}.fromkeys(('a','s','d'),1)
>>> dic
{'a': 1, 's': 1, 'd': 1}
>>> dic={}.fromkeys(['a','s','d'],1)
>>> dic
{'a': 1, 's': 1, 'd': 1}
操作
通路及修改
字典類型的對象是以鍵值對的形式存儲資料的。是以,隻要知道鍵,就能找到值。本質上就是一種映射關系。
{'a': 10, 's': 10, 'd': 10}
>>> dic['a']
10
>>> dic['a']=9
>>> dic
{'a': 9, 's': 10, 'd': 10}
長度len()
傳回字典(d)中的鍵值對的數量。
>>> dic
{'a': 9, 's': 10, 'd': 10}
>>> len(dic)
3
查找及删除
key in d, 檢查字典(d) 中是否含有鍵為key的項。
# 修改
>>> dic={'a': 9, 's': 10, 'd': 10}
>>> 'a' in dic
True
del d[key], 删除字典(d) 的鍵(key) 項(将該鍵值對删除) 。
# 删除指定項
>>> del dic['a']
>>> dic
{'s': 10, 'd': 10}
# 删除整個字典
>>> del dic
>>> dic
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'dic' is not defined
字元串格式化輸出
關于字元串格式化輸出問題在字元串一章已經涉及過,這裡主要探究通過字典實作格式化字元串對目的。
>>> print("c's value is %(c)s. a's value is %(a)s" %dic)
c's value is 7. a's value is 3
字典的函數
跟前面所講述對其他對象類似,字典也有一些函數,通過這些函數我們能夠實作對字典對操作。
copy和deepcopy
在python中,“ = ” 是一種引用的複制,這一點在數字那一張也有詳細從記憶體上讨論過,這裡我們再次回顧一下:
>>> a=2
>>> b=a
>>> id(a)
140707635106656
>>> id(b)
140707635106656
由于python中的變量都是采用的引用語義,資料結構可以包含基礎資料類型,導緻了在python中每個變量中都存儲了這個變量的位址,而不是值本身。
同樣如果如果僅僅是單純對使用 “ = ” 來複制的話,就像在清單以及數字中提及的那樣,複制過來的僅僅是抵制飲用而已。
>>> dic={}.fromkeys(('asd','qwe'),1)
>>> copy_dic=dic
>>> id(dic)
1654004468616
>>> id(copy_dic)
1654004468616
這樣做會有什麼和後果呢?假如我們希望在複制的内容中做一些修改将結果輸出,而原來對内容并不希望改變。由于使用對是位址引用,是以在改變copy_dic的時候,dic也變了。
>>> copy_dic['asd']=2
>>> dic
{'asd': 2, 'qwe': 1}
如何做到複制對是值而不是對象對引用呢? 這時候copy()大喊一聲:我來了!
>>> id(dic)
1654004468616
>>> copy_dic=dic.copy()
>>> id(copy_dic)
1654004466024
>>> dic
{'asd': 2, 'qwe': 1}
>>> copy_dic
{'asd': 2, 'qwe': 1}
我們驚奇的發現,通過copy()後,複制對是值而不是位址了。可是還有一個問題:
>>> dic={'name':'zhang','learn':['math','physics','PE']}
>>> copy_dic=dic.copy()
>>> copy_dic['learn'].remove('PE')
>>> copy_dic
{'name': 'zhang', 'learn': ['math', 'physics']}
>>> dic
{'name': 'zhang', 'learn': ['math', 'physics']}
诶?woc什麼鬼,難道copy()的不對嗎?讓我來叫id()來查檢視:
>>> id(dic)
1654004468400
>>> id(copy_dic)
1654004465808
是不是更加迷惑了,别急,讓我們想想問題出在哪了,首先我們通過copy()複制過來的一定是值而不是位址,對于list來說它的值就是list對引用,即雖然兩個字典不是同一個位址塊,但兩個字典中對清單對應的是同一個清單區域。
>>> id(dic['learn'])
1654004267976
>>> id(copy_dic['learn'])
1654004267976
怎麼辦呢?deepcopy()這時候過來了,老哥不行了呀,換我來吧:
>>> import copy
>>> dic={'name':'zhang','learn':['math','physics','PE']}
>>> copy_dic=copy.deepcopy(dic)
>>> copy_dic['learn'].remove('PE')
>>> dic
{'name': 'zhang', 'learn': ['math', 'physics', 'PE']}
>>> copy_dic
{'name': 'zhang', 'learn': ['math', 'physics']}
關于深淺拷貝還可以參見python——指派與深淺拷貝
clear清除
簡言之,clear()的作用就是将字典内容清空。我們先看一下clear的函數說明:
Help on method_descriptor:
clear(...)
D.clear() -> None. Remove all items from D.
讓我們來看一下clear的運作結果,可以發現通過使用clear()主動将字典中的内容删除掉了,當然也可以直接用“dic={}”将dic的引用轉向“{}”,原來的内容沒有引用則變成了垃圾,python會主動回收。當然,如果不想用了也可以直接用del删掉。
>>> dic
{'name': 'zhang', 'learn': ['math', 'physics', 'PE']}
>>> dic.clear()
>>> dic
{}
get和setdefult
get()
先讓我們看一下get()的函數說明:
>>> help(dict.get)
Help on method_descriptor:
get(self, key, default=None, /)
Return the value for key if key is in the dictionary, else default.
可以看到如果key在字典中,則傳回key的值,否則傳回default。
>>> dic={'name':'zhang','learn':['math','physics','PE']}
>>> dic.get('name','null')
'zhang'
>>> dic.get('age','null')
'null'
dict.get()相對于dict[i]而言,沒有那麼嚴格。dict.get()可以對字典中沒有存在的鍵傳回初值或着不傳回。但dict[i]則會直接報錯。
setdefault()
先讓我們看一下setdefult()的函數說明:
>>> help(dict.setdefault)
Help on method_descriptor:
setdefault(self, key, default=None, /)
Insert key with a value of default if key is not in the dictionary.
Return the value for key if key is in the dictionary, else default.
與get不同的是,如果key不在字典中,則插入值為default的key。如果key在字典中,則傳回key的值,否則傳回default。
>>> dic
{'name': 'zhang', 'learn': ['math', 'physics', 'PE']}
>>> dic.setdefault('name','null')
'zhang'
>>> dic.setdefault('age','null')
'null'
>>> dic
{'name': 'zhang', 'learn': ['math', 'physics', 'PE'], 'age': 'null'}
>>> dic.setdefault('sex')
>>> dic
{'name': 'zhang', 'learn': ['math', 'physics', 'PE'], 'age': 'null', 'sex': None}
items, keys, values
老規矩,先讓我們看一下函數說明:
>>> help(dict.items)
Help on method_descriptor:
items(...)
D.items() -> a set-like object providing a view on D's items
# 一個類似于集合的對象,提供D的項目視圖
我們可以使用dict.items()來周遊字典中的資料,當然如果我們直接使用list得到的是dict的鍵,通過dict.items()提供的視圖我們可以将整個字典轉化為list。
>>> dic=dict(name="wangwu",age=25)
>>> dic.items()
dict_items([('name', 'wangwu'), ('age', 25)])
>>> for i,j in dic.items():
... print(i,":",j)
name : wangwu
age : 25
>>> list(dic)
['name', 'age']
>>> list(dic.items())
[('name', 'wangwu'), ('age', 25)]
相似的keys和values提供的則分别是鍵和值的視圖。
>>> dic.keys()
dict_keys(['name', 'age'])
>>> dic.values()
dict_values(['wangwu', 25])
pop和popitem
在list中我們有提到過pop和remove,其中list.pop(i)是删除指定索引元素,而list.remove(x)則是删除指定元素。
字典中我們也有兩個類似的删除方式pop和popitem,在pop中是指删除指定鍵和對應的值,傳回值。在popitem中則是随機删除一組鍵值并傳回(一般是随機加載出來字典的最後一個元素)。
>>> dic
{'name': 'wangwu', 'age': 25}
# pop
>>> dic.pop("name")
'wangwu'
#popitem
>>> dic.popitem()
('age', 25)
update
首先讓我們先來看一下函數說明:
>>> help(dict.update)
Help on method_descriptor:
update(...)
D.update([E, ]**F) -> None. Update D from dict/iterable E and F.
If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
#如果E存在且有.key()方法,則執行:for k in E: D[k] = E[k]
If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v
#如果E存在且沒有.key()方法,則執行:for k, v in E: D[k] = v
In either case, this is followed by: for k in F: D[k] = F[k]
可以看出首先這個函數是沒有傳回值的,它的作用就是更新字典。其參數是字典或者某種可以疊代的對象。
# 字典更新字典
>>> E=dict(name="wangwu")
>>> D=dict(sex=22)
# 方式一
>>> D.update(E)
>>> D
{'sex': 22, 'name': 'wangwu'}
# 方式二
>>> E=(["sex",20],["lang","python"])
>>> D.update(E)
>>> D
{'sex': 20, 'name': 'wangwu', 'lang': 'python'}
# 方式三
>>> D.update(name="zhangsan")
>>> D
{'sex': 20, 'name': 'zhangsan', 'lang': 'python'}