時間:2018-11-03 作者:魏文應
一、字典
什么是字典?
- 字典屬于一種新的數(shù)據(jù)結構,稱為映射(mapping)。
- 字典的作用和列表類似,都是用來存儲對象的容器。
- 列表存儲數(shù)據(jù)的性能很好,但是查詢數(shù)據(jù)的性能很差。
- 在查詢元素時,字典的效率是非常快的。
- 在字典中,每一個元素都有一個唯一的名字,通過這個唯一的名字,可以快速的查找到指定的元素。
在字典中,可以保存多個對象,每個對象都會有一個唯一的名字:
- 這個唯一的名字,我們稱其為 鍵(key),通過 key 可以快速的查詢 value 。
- 這個對象,我們稱其為值(value)。
- 所以字典,我們也叫做 鍵值對(key-value) 結構 。
- 每一個鍵值對,我們稱其為一項(item)。
創(chuàng)建字典
字典通過大括號 { } 進行創(chuàng)建,例如:
d = {} # 創(chuàng)建了一個空字典
字典創(chuàng)建的語法如下:
# 字典的值可以是任意對象
# 字典的鍵可以是任意的不可變對象(int、str、bool、tuple ...)
# 字典的鍵不能重復,一般用字符串 str。
{key:value, key:value, key:value}
例如:
d = {
'name': '孫悟空',
'age': 18,
'gender': '男'
}
print(d['name'], d['age'], d['gender'])
通過 鍵 索引到了 值 ,打印結果如下:
孫悟空 18 男
dict() 函數(shù)創(chuàng)建字典
使用 dict() 函數(shù)創(chuàng)建字典:
d = dict(name='孫悟空', age=18, gender='男')
print(d, type(d))
這種方式創(chuàng)建的字典,key 都是字符串,打印結果如下:
{'name': '孫悟空', 'age': 18, 'gender': '男'} <class 'dict'>
dict() 函數(shù),也可以將一個包含有 雙值子序列的序列 轉換為字典:
d = dict([('name', '孫悟空'), ('age', 18)])
print(d, type(d))
子序列中,前面一個元素為鍵,后面一個元素為值,打印結果如下:
{'name': '孫悟空', 'age': 18} <class 'dict'>
雙值序列
序列中只有兩個字值的序列叫做 雙值序列,比如下面的都是雙值序列:
[1, 3]
['a', 1]
'ab'
子序列
如果序列中的元素也是序列,那么稱這個元素為 子序列。比如:
[(1, 3), (3, 5)]
獲取鍵值對個數(shù)
可以通過 len() 函數(shù),獲取字典中鍵值對的個數(shù),比如:
d = {'a':1, 'b':2, 'c':3}
print(len(d))
這就獲取了字典 d 中的鍵值對個數(shù),打印結果如下:
3
檢查是否包含某個鍵
可以使用 in 檢查字典中是否包含某個鍵,比如:
d = {'a': 1, 'b': 2, 'c': 3}
print('hello' in d)
上面,檢查 hello 這個鍵在不在 d 這個字典中,打印結果如下:
False
get() 方法獲取鍵
可以使用 get() 方法,來獲取鍵,如果鍵不存在,返回 None 。比如:
d = {
'name': '孫悟空',
'age': 18,
'gender': '男'
}
print(d.get('name')) # 返回鍵值孫悟空
print(d.get('hello')) # hello 鍵沒有,返回 None
print(d.get('hello', '沒有hello')) # 沒有hello鍵時,返回 '沒有hello'
如果直接使用 d['hello'] 去索引字典,程序會因為字典沒有這個鍵而報錯,通過get()方法則不會報錯,打印結果如下:
孫悟空
None
沒有hello
修改字典
可以通過 d[key] = value 的方式,來進行字典元素值的修改:
d = {'name': '孫悟空','age': 18,'gender': '男'}
d['name'] = 'sunwukong'
print(d)
上面,修改了鍵為 name 的值,打印結果如下:
{'name': 'sunwukong', 'age': 18, 'gender': '男'}
如果沒有對應的鍵,則在字典末尾自動添加,比如:
d = {'name': '孫悟空','age': 18,'gender': '男'}
d['address'] = '花果山'
print(d)
上面,因為沒有 address 這個鍵,所以,就自動在末尾添加一個鍵值對 'address': '花果山',打印結果如下:
{'name': '孫悟空', 'age': 18, 'gender': '男', 'address': '花果山'}
可以使用 setdefualt(key[, default]) 方法,來向字典添加 key-value :
- 如果 key 已經(jīng)存在于字典中,則返回 key 值,不會對字典做任何操作。
- 如果 key 不存在,則向字典中添加這個 key ,并設置 value 。
d = {'name': '孫悟空', 'age': 18, 'gender': '男'}
d.setdefault('name', '豬八戒')
print(d)
d.setdefault('address', '花果山')
print(d)
所以,打印結果如下:
{'name': '孫悟空', 'age': 18, 'gender': '男'}
{'name': '孫悟空', 'age': 18, 'gender': '男', 'address': '花果山'}
合并字典
可以使用 update() 方法,合并字典,如果遇到相同的鍵,則更新這個鍵的值。比如:
d = {'a': 1, 'b': 2, 'c': 3}
d2 = {'d': 4, 'e': 5, 'f': 6, 'a': 7}
d2.update(d)
print(d2)
d 被合并到了 d2 后面,相同的鍵名 a 的對應的值被更新了,打印結果如下:
{'d': 4, 'e': 5, 'f': 6, 'a': 1, 'b': 2, 'c': 3}
刪除字典中的鍵值對
可以使 del 刪除字典中的一個鍵值對,例如:
d = {'a': 1, 'b': 2, 'c': 3}
del d['a']
print(d)
上面,就會把鍵值對 'a': 1 刪除掉,打印結果如下:
{'b': 2, 'c': 3}
如果沒有對應的鍵名,則會報錯,比如:
d = {'a': 1, 'b': 2, 'c': 3}
del d['f'] # 這里會報錯
還可以使用 popitem(), 隨機刪除 字典中的一個鍵值對,一般都會刪除最后一個鍵值對:
- 刪除之后,它會將刪除的 key-value 作為返回值返回。
- 返回的是一個元組,元組中有兩個元素,第一個是已經(jīng)刪除的 key,第二個是刪除的 value 。
d = {'a': 1, 'b': 2, 'c': 3}
result = d.popitem()
print('result =',result)
print(d)
打印結果如下:
result = ('c', 3)
{'a': 1, 'b': 2}
還可以使用 pop() 方法進行刪除指定的鍵值對:
- 根據(jù) key 刪除字典中的 key-value 。
- 如果刪除不存在的 key ,會拋出異常。
- 如果指定了默認值,當遇到不存在的 key 時,不會報錯,而是直接返回默認值。
d = {'a': 1, 'b': 2, 'c': 3}
result = d.pop('a')
print('result =', result)
print(d)
result = d.pop('f', '鍵值不存在')
print('result =', result)
打印結果如下:
result = 1
{'b': 2, 'c': 3}
result = 鍵值不存在
清空字典(clear)
可以使用 clear() 方法,清空字典內的所有鍵值對:
d = {'a': 1, 'b': 2, 'c': 3}
d.clear()
print(d)
上面,清空了字典 d 內的所有鍵值對,打印結果如下:
{}
淺復制
可以使用 copy() 方法進行復制操作,將一個字典 d 復制到 d2 中。注意:
- 淺復制只是簡單復制對象的值,如果值是一個 可變對象,這個可變對象不會被復制。
d = {'a': {'name': '豬八戒'}, 'b': 2, 'c': 3}
d2 = d.copy()
d2['a']['name'] = '孫悟空'
d2['b'] = 11
print('d =', d, id(d))
print('d2 = ', d2, id(d2))
上面, d 和 d2 是相互對立的,但鍵值對 'a': {'name': '豬八戒'} 的值是一個可變對象,d2['a']['name'] = '孫悟空' 會使得 d 和 d2都發(fā)生改變??梢岳斫鉃?,字典 d 和 d2 的鍵值對的值只是保存了變量的地址。
遍歷字典
字典的遍歷,有多種方法,可以使用 keys() 方法,獲取 鍵值對 :
d = {'a': {'name': '豬八戒'}, 'b': 2, 'c': 3}
for k in d.keys():
print(k, d[k])
上面,打印結果如下:
name 沙和尚
b 2
c 3
也可以通過 value() 方法,但這樣只獲取到 值 :
d = {'name': '沙和尚', 'b': 2, 'c': 3}
for v in d.values():
print(v)
上面,打印結果如下:
沙和尚
2
3
還可以使用 items() 方法,它會返回序列,序列中包含有 雙值子序列 :
d = {'name': '沙和尚', 'b': 2, 'c': 3}
print(d.items())
for k, v in d.items():
print(k, '=', v)
打印結果如下:
dict_items([('name', '沙和尚'), ('b', 2), ('c', 3)])
name = 沙和尚
b = 2
c = 3