4.7 字典(dict)
字典是Python中一种非常重要的数据类型。字典和之前的列表、元组不同,里面的元素使用键-值
对进行存储。通常字典中元素的键
由字符串或数字等可哈希数据类型组成。
可以把字典想象成一个集合,只不过每个元素都是由键-值
对组成。字典中的元素的键是不能重复的。字典中的元素也是无序的,这点和集合一样。
可以通过键获取集合中元素的值,并且速度要远快于列表。这种速度上的差异在数据量特别大时更加明显。
4.7.1 字典的创建
4.7.1.1 通过字典标识符号创建
列表在创建的时候用{}
做标识。内部的元素用逗号进行分隔。注意:字典和集合都是用{}
做标识的。
>>> dct1 = {} # 空字典
>>> dct2 = {‘a’: 1, ‘b’: 2} # 字典中存放了2个元素
>>> dct3 = {‘小明’: 20, ‘小芳’: 18} # 字典中存放了2个元素
>>> dct4 = {[1]: 2} # 尝试用不可哈希数据类型(列表)作为键导致报错
Traceback (most recent call last):
File “C:\Program Files\Python3102\lib\code.py”, line 90, in runcode
exec(code, self.locals)
File “”, line 1, in
TypeError: unhashable type: ‘list’
4.7.1.2 通过字典推导式创建
>>> dct = {i: i ** 2 for i in range(3)}
>>> dct
{0: 0, 1: 1, 2: 4}
4.7.1.3 通过dict函数创建
>>> dict() # 空字典
>>> dict(a=‘a’, b=‘b’, c=‘c’) # 通过关键字创建字典
>>> dict(zip([‘one’, ‘two’], [1, 2])) # 通过映射函数方式创建字典
>>> dict([(‘one’, 1), (‘two’, 2)]) # 通过可迭代对象创建字典
4.7.2 字典的访问
4.7.2.1 通过键
访问
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct[‘two’]
2
>>> dct[‘zero’] # 如果键
不存在,则会报错
Traceback (most recent call last):
File “C:\Program Files\Python3102\lib\code.py”, line 90, in runcode
exec(code, self.locals)
4.7.2.2 遍历字典
参见可迭代对象的遍历
注意:遍历字典和其它遍历可迭代对象有所区别,遍历字典所得到的是字典的所有的元素的键
。
dct = {'one': 1, 'two': 2, 'three': 3}
for i in dct:
print(i)
one
two
three
4.7.2.3 成员资格检查
参见可迭代对象中的成员资格检查
注意:成员资格检查和其它可迭代对象有所区别,对于字典,是判断某个成员是否是字典的某个元素的键
。
dct = {'one': 1, 'two': 2, 'three': 3}
print('one' in dct)
print('zero' in dct)
True
False
4.7.3 字典的修改
4.7.3.1 单个元素的修改
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct[‘two’] = 22
>>> dct[‘two’]
22
4.7.3.2 通过|
得到更新后的字典
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct2 = {‘zero’: 0, ‘two’: 22}
>>> dct3 = dct | dct2
>>> dct3
{‘one’: 1, ‘two’: 22, ‘three’: 3, ‘zero’: 0}
4.7.3.3 通过|=
原地更新字典
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct2 = {‘zero’: 0, ‘two’: 22}
>>> dct |= dct2
>>> dct
{‘one’: 1, ‘two’: 22, ‘three’: 3, ‘zero’: 0}
4.7.3.4 通过解包方式得到更新后的字典
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct2 = {‘zero’: 0, ‘two’: 22}
>>> dct3 = {**dct, **dct2}
>>> dct3
{‘one’: 1, ‘two’: 22, ‘three’: 3, ‘zero’: 0}
4.7.4 字典的删除
4.7.4.1 删除某个元素
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> del dct[‘two’]
>>> dct[‘two’] # 删除元素后再次访问则会报错
Traceback (most recent call last):
File “C:\Program Files\Python3102\lib\code.py”, line 90, in runcode
exec(code, self.locals)
File “”, line 1, in
KeyError: ‘two’
4.7.4.2 删除整个字典
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> del dct
>>> dct # 删除字典后再次访问则会报错
Traceback (most recent call last):
File “C:\Program Files\Python3102\lib\code.py”, line 90, in runcode
exec(code, self.locals)
File “”, line 1, in
NameError: name ‘dct’ is not defined. Did you mean: ‘dct1’?
4.7.5 字典的方法
4.7.5.1 添加元素
4.7.5.1.1 dict.update(dict2)
描述
把字典dict2的键/值对更新到dict里
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct2 = {‘zero’: 0, ‘two’: 22}
>>> dct.update(dct2)
>>> dct
{‘one’: 1, ‘two’: 22, ‘three’: 3, ‘zero’: 0}
4.7.5.2 删除元素
4.7.5.2.1 clear()
描述
清空字典(删除字典中所有的元素)
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct.clear()
>>> dct
{}
4.7.5.2.2 pop(key[,default])
描述
返回并删除字典中key这个键对应的值,如果键不存在,则返回default
作为提示信息,如果没有设置default
,则会引发KeyError异常。
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct.pop(‘one’)
1
>>> dct
{‘two’: 2, ‘three’: 3}
>>> dct.pop(‘zero’, ‘没有这个key’)
‘没有这个key’
>>> dct.pop(‘zero’)
Traceback (most recent call last):
File “C:\Program Files\Python3102\lib\code.py”, line 90, in runcode
exec(code, self.locals)
File “”, line 1, in
KeyError: ‘zero’
4.7.5.2.3 popitem()
描述
返回并删除字典中的最后一对键和值。
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct.popitem()
(‘three’, 3)
>>> dct
{‘one’: 1, ‘two’: 2}
4.7.5.3 查询统计类
4.7.5.3.1 get(key, default=None)、setdefault(key, default=None)
描述
返回(设置)指定键的值,如果键不在字典中返回(设置)default设置的默认值。
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct.get(‘one’)
>>> dct.get(‘zero’)
>>> dct.get(‘zero’, 0)
1
None
0
注意:
1、如果指定的键
存在,则get或者setdefault都是获取到这个键
的值。
2、如果指定的键
不存在,则get直接返回default指定的值。而setdefault不但返回default指定的值还会修改字典的内容。
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct.get(‘zero’, 0)
0
>>> dct
{‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct.setdefault(‘zero’, 0)
0
>>> dct
{‘one’: 1, ‘two’: 2, ‘three’: 3, ‘zero’: 0}
4.7.5.3.2 keys()、values()
描述
返回字典所有的键
(值),注意返回的结果是dict_keys和dict_values类型的数据。可以通过for循环获取里面的元素,也可以通过list或者tuple转换成列表或元组。
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct.keys()
dict_keys([‘one’, ‘two’, ‘three’])
4.7.5.3.3 items()
描述
返回字典所有的键-值
,注意返回的结果是dict_items类型的数据。可以通过for循环获取里面的元素,也可以通过list或者tuple转换成列表或元组。
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct.items()
dict_items([(‘one’, 1), (‘two’, 2), (‘three’, 3)])
4.7.5.4 其它类
4.7.5.4.1 copy()
描述
返回一个字典的浅复制
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct2 = dct.copy()
>>> dct2
{‘one’: 1, ‘two’: 2, ‘three’: 3}
4.7.5.4.2 fromkeys(seq, val)
描述
创建一个新的字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值,如果没有提供val则所有键的值默认为None。
示例
>>> dct = {‘one’: 1, ‘two’: 2, ‘three’: 3}
>>> dct2 = dct.fromkeys(‘abc’)
>>> dct3 = dct.fromkeys(‘abc’, 123)
>>> dct2
>>> dct3
{‘a’: None, ‘b’: None, ‘c’: None}
{‘a’: 123, ‘b’: 123, ‘c’: 123}
4.7.6 字典的应用
4.7.6.1 将字符串格式设置功能用于字典
在之前的学习中,我们知道了可以通过format的方式对字符串进行格式化。这里介绍一种更加简单易用的方式,那就是通过format_map来实现对字符串的格式化。
format_map可以让我们通过一个字典映射来对字符串进行格式化。
>>> phonebook = {‘Beth’: ‘9102’, ‘Alice’: ‘2341’, ‘Cecil’: ‘3258’}
>>> “Cecil’s phone number is {Cecil}.”.format_map(phonebook)
“Cecil’s phone number is 3258.”
在模板系统中,这种字符串格式设置方式很有用(下面的示例使用的是HTML)。
>>> template = ‘’‘
>>> …
>>> …
>>> …
{title}
>>> …
{text}
>>> … ’‘’
>>> data = {‘title’: ‘My Home Page’, ‘text’: ‘Welcome to my home page!’}
>>> template.format_map(data)
My Home Page My Home Page
Welcome to my home page!
4.7.6.2 字典排序
字典其实是一种无序的数据,但是有时候又希望字典能够按照一定的顺序一遍我们能够输出或者查看。这时就需要对字典进行排序了。
4.7.6.2.1 根据key排序
dct = {'one': 1, 'two': 2, 'three': 3}
for k in sorted(dct):
print(k, dct[k])
one 1
three 3
two 2
4.7.6.2.2 根据value排序
dct = {'one': 1, 'two': 2, 'three': 3, 'zero': 0}
for k in sorted(dct, key=dct.__getitem__):
print(k, dct[k])
zero 0
one 1
two 2
three 3