字典一種key - value 的數據類型,使用就像我們上學用的字典,通過筆划、字母來查對應頁的詳細內容。
定義字典(dictionary)
info = { 'stu1101': "Amy", 'stu1102': "Bob", 'stu1103': "Cindy" }
字典的特性:
- dict是無序的
- key必須是唯一的,so 天生去重
- 查詢速度快,比列表快多了
- 比list占用內存多
為什么會查詢速度會快呢?因為他是hash類型的,那什么是hash呢?
哈希算法將任意長度的二進制值映射為較短的固定長度的二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨后的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的,所以數據的哈希值可以檢驗數據的完整性。一般用於快速查找和加密算法
dict會把所有的key變成hash 表,然后將這個表進行排序,這樣,你通過data[key]去查data字典中一個key的時候,python會先把這個key hash成一個數字,然后拿這個數字到hash表中看沒有這個數字, 如果有,拿到這個key在hash表中的索引,拿到這個索引去與此key對應的value的內存地址那取值就可以了。
增加
>>> info["stu1104"]="David" #增加 >>> info {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'}
刪除
>>> info {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'} >>> info.pop("stu1101") #標准刪除 'Amy' >>> info {'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'} >>> del info["stu1103"] #換個姿勢刪除,del是Python自帶的,想刪誰就刪誰 >>> info {'stu1102': 'Bob', 'stu1104': 'David'} >>> info.popitem() #隨機刪除 ('stu1104', 'David') >>> info {'stu1102': 'Bob'}
查找
>>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"}
>>> "stu1102" in info #標准用法,判斷一個key是否在字典中存在
True
>>> info.get("stu1102") #獲取
'Bob'
>>> info["stu1102"] #同上,但是看下面
'Bob'
>>> info.get("stu1105") #key不存在返回None
>>> print(info.get("stu1105"))
None
>>> info["stu1105"] #key不存在就報錯,慎用
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'stu1105'
修改
>>> info {'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy'} >>> info["stu1101"]="Alex" #修改 >>> info {'stu1101': 'Alex', 'stu1102': 'Bob', 'stu1103': 'Cindy'}
其他
>>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"}
>>> info.values() #輸出字典中所有的value
dict_values(['Amy', 'Bob', 'Cindy'])
>>> info.keys() #輸出字典中所有的key
dict_keys(['stu1101', 'stu1102', 'stu1103'])
>>> info.setdefault("stu1106","xiaoming") #查找字典中是否有stu1106,若沒有則創建並為其賦值為xiaoming
'xiaoming'
>>> info
{'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming'}
>>> info.setdefault("stu1101","Alex") #查找字典中是否有stu1101,若有,返回其值,且不修改
'Amy'
>>> info
{'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming'}
>>> b={1:2,3:4,'stu1101':'Alex'}
>>> info.update(b) #兩個字典表合並,若key有交叉則覆蓋其值
>>> info
{'stu1101': 'Alex', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming',1: 2, 3: 4}
>>> info.items() #字典轉成列表
dict_items([('stu1101', 'Alex'), ('stu1102', 'Bob'), ('stu1103', 'Cindy'), ('stu1106', 'xiaoming'), (1, 2), (3, 4)])
>>> dict.fromkeys([1,2,3],'test') #通過一個列表生成默認dict,最好少用,因為有個不好解釋的坑,如下
{1: 'test', 2: 'test', 3: 'test'}
>>>
>>> c=dict.fromkeys([1,2,3],'test')
>>> c
{1: 'test', 2: 'test', 3: 'test'}
>>> c[1]="aaa" #無嵌套時,只修改1對應的value
>>> c
{1: 'aaa', 2: 'test', 3: 'test'}
>>> c=dict.fromkeys([6,7,8],["aa",{"name":"Alex"},"bb"])
>>> c
{6: ['aa', {'name': 'Alex'}, 'bb'], 7: ['aa', {'name': 'Alex'}, 'bb'], 8: ['aa', {'name': 'Alex'}, 'bb']}
>>> c[7][1]["name"]="jack" #多層嵌套時,所有的key對應的value都修改,類似於列表的copy方法
>>> c
{6: ['aa', {'name': 'jack'}, 'bb'], 7: ['aa', {'name': 'jack'}, 'bb'], 8: ['aa', {'name': 'jack'}, 'bb']}
循環dict
>>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"}
>>> for key in info:
... print(key,info[key]) #方法1,高效,建議使用
...
stu1101 Amy
stu1102 Bob
stu1103 Cindy
>>> for k,v in info.items():
... print(k,v) #方法2,會先把dict轉成list,數據里大時莫用
...
stu1101 Amy
stu1102 Bob
stu1103 Cindy
>>>
多級字典嵌套及操作
...
