Python 第七天 dict字典详解
Python字典(dict)是一种无序的、可变的序列,元素以”键值对(key-value)“的形式存储。
字典是Python中唯一的映射类型。映射:元素之间相互对应的关系,即通过一个元素,可以唯一找到另一个元素;
元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为”键值对“。
字典类型的主要特征:
字典也有自己的类型:
a = {'name':'张三', 'age':25}
print(type(a))
<class 'dict'>
创建字典:
(1)使用 { } 创建字典;
字典中每个元素都包含两部分,分别是键(key)和值value),键和值在创建时用冒号 : 分隔,相邻元素之间用逗号分隔,所有元素都放在大括号 { } 里。
语法格式:(同一个字典里的键必须唯一)
dict_name = {'key': 'value1', 'key2': 'value2',...,'keyn':'value'}
实例:
1 # 使用字符串作为key
2 scores = {"数学":85, "语文": 95, "英语": 88}
3 print(scores)
4
5 # 使用元组和数字作为key
6 dict1 = {(20, 30): 'great', 30: [1, 2, 3]}
7 print(dict1)
8
9 # 创建空元组
10 dict2 = { }
11 print(dict2)
结果:
{'数学': 85, '语文': 95, '英语': 88}
{(20, 30): 'great', 30: [1, 2, 3]}
{}
字典的值可以是python支持的任意数据类型,只要符合唯一和不可变的特性就行;
(2)通过fromkeys() 方法创建字典:
语法格式:
dict_name = dict.fromkeys(list, value = None)
list 参数表示字典中所有键的列表(list);value 参数表示默认值,如果不写,则为空值 None。
示例:
1 knowledge = ['语文', '数学', '英语']
2 score = dict.fromkeys(knowledge, 60)
3 print(score)
结果:
{'语文': 60, '数学': 60, '英语': 60}
这样就相当于初始化字典,设置 value 的默认值。
(3)通过 dict() 映射函数创建函数:
注意:若采用以上的方式创建字典,字典里的各元素的键只能是字符串、元组或者数字,不能是列表。列表是可变的,不能作为键。
如果不为 dict() 函数传入任何函数,则创建一个空的字典。
访问字典:
字典访问元素,是通过键来访问对应的值。因为字典中的元素是无序的,每个元素的位置都不固定。
具体格式:
dict_name[key]
注意:key是键名,必须得是存在的,否则会抛出异常
示例:
1 a = (['one', 36], ['two', 72], ['three', 150], ['four', -89])
2 dic = dict(a)
3 # 键存在
4 print(dic['one'])
5 # 键不存在
6 print(dic['five'])
结果:
36
Traceback (most recent call last):
File "D:\pythonProject\one day\test.py", line 410, in <module>
print(dic['five'])
KeyError: 'five'
此外,也可以使用 dict 类型提供的 get() 方法来获取指定键对应的值。当指定的键不存在时,get() 方法不会抛出异常。
语法格式:
dict_name.get(key[,default])
dict_name 表示字典变量的名字;key 表示指定的键;default 用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,会返回 None。
示例:
1 a = dict(two=0.15, one=58, three=150, four=-36)
2 print(a.get('one'))
结果:
58
当键不存在时,get() 返回空值None,也可手动设置返回的值;
示例:
1 a = dict(two=0.15, one=58, three=150, four=-36)
2 # 键不存在,返回空值None
3 print(a.get('five'))
4 # 键不存在,返回指定内容
5 print(a.get('six', '该键不存在'))
结果:
None
该键不存在
删除字典:
手动删除也可以使用 del 关键字。
示例:
1 a = dict(two=0.15, one=58, three=150, four=-36)
2 print(a)
3 del a
4 print(a)
结果:
{'two': 0.15, 'one': 58, 'three': 150, 'four': -36}
Traceback (most recent call last):
File "D:\pythonProject\one day\test.py", line 417, in <module>
print(a)
NameError: name 'a' is not defined
字典的基本操作(添加、修改、删除键值对)
添加键值对:
具体语法格式:
dict_name[key] = value
示例:
1 a = {'数学': 90}
2 print(a)
3 # 添加新键值对
4 a['语文'] = 95
5 print(a)
6 a['英语'] = 88
7 print(a)
结果:
{'数学': 90}
{'数学': 90, '语文': 95}
{'数学': 90, '语文': 95, '英语': 88}
修改键值对:
key不能修改,只能修改value;
示例:
1 a = {'数学': 90, '语文': 95, '英语': 88}
2 print(a)
3 a['语文'] = 100
4 print(a)
结果:
{'数学': 90, '语文': 95, '英语': 88}
{'数学': 90, '语文': 100, '英语': 88}
删除键值对:
使用 del 关键字。
示例:
1 a = {'数学': 90, '语文': 95, '英语': 88}
2 del a['数学']
3 del a['语文']
4 print(a)
结果:
{'英语': 88}
判断字典中是否存在指定键值对:
判断字典是否包含指定键值对的键,使用 in 或 not in 运算符,基于 key 来判断。
示例:
1 a = {'数学': 90, '语文': 95, '英语': 88}
2 # 判断 a 中是否包含名为 ‘数学’ 的key
3 print('数学' in a)
4 # 判断 a 是否包含名为 '化学' 的key
5 print('化学' in a)
结果:
True
False
keys()、values()和items()方法:
keys() 方法用于返回字典中的所有键(key);
values() 方法用于返回字典中所有键对应的值(value);
items() 用于返回字典中所有的键值对(key-value)。
示例:
1 a = {'数学': 90, '语文': 95, '英语': 88}
2 print(a.keys())
3 print(a.values())
4 print(a.items())
结果:
dict_keys(['数学', '语文', '英语'])
dict_values([90, 95, 88])
dict_items([('数学', 90), ('语文', 95), ('英语', 88)])
如果想使用这三个方法返回的数据,可以采取以下两种方法:
(1)使用 list() 函数,将返回的数据转换成列表:
1 a = {'数学': 90, '语文': 95, '英语': 88}
2 b = list(a.keys())
3 print(b)
结果:
['数学', '语文', '英语']
(2)使用 for in 循环遍历它们的返回值:
1 a = {'数学': 90, '语文': 95, '英语': 88}
2 for b in a.keys():
3 print(b, end=' ')
4 print("\n-----------")
5 for c in a.values():
6 print(c, end=' ')
7 print('\n+++++++++++')
8 for b,c in a.items():
9 print("key:", b, " values:", c)
结果:
数学 语文 英语
-----------
90 95 88
+++++++++++
key: 数学 values: 90
key: 语文 values: 95
key: 英语 values: 88
copy() 方法:
返回一个字典的拷贝,也返回一个具有相同键值对的新字典。
示例:
1 a = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
2 b = a.copy()
3 print(b)
结果:
{'one': 1, 'two': 2, 'three': [1, 2, 3]}
注意:copy()方法遵循的拷贝原理,既有深拷贝也有浅拷贝。copy()方法只会对最表层的键值对进行浅拷贝,会申请一块内存来存放{'one': 1, 'two': 2, 'three': []};对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说。b中的[1, 2, 3]的值不是自己独有,而是和 a 共有。
1 a = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
2 b = a.copy()
3 # 向 a 中添加新键值对,由于b已经提前将 a 所有的键值对都深拷贝过来,因此 a 添加键值对不会影响 b。
4 a['four'] = 100
5 print(a)
6 print(b)
7 # 由于 b 和 a 共享[1, 2, 3](浅拷贝),因此移除 a 中列表中的元素,也会影响 b.
8 a ['three'].remove(1)
9 print(a)
10 print(b)
结果:
{'one': 1, 'two': 2, 'three': [1, 2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [1, 2, 3]}
{'one': 1, 'two': 2, 'three': [2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [2, 3]}
update() 方法:
使用一个字典所包含的键值对来更新已有的字典。如何被更新的字典中已包含对应的键值对,那么原value会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。
示例:
1 a = {'one': 1, 'two': 2, 'three': 3}
2 a.update({'one': 4.5, 'four': 9.3})
3 print(a)
结果:
{'one': 4.5, 'two': 2, 'three': 3, 'four': 9.3}
pop() 和popitem() 方法:
pop() 用来删除指定的键值对,popitem() 用来随机删除一个键值对。
语法格式:
dict_name.pop(key)
dict_name.popitem()
示例:
1 a = {"数学": 98, "语文": 88, "英语": 95, "化学": 84, "生物": 96, "物理": 97}
2 print(a)
3 a.pop("化学")
4 print(a)
5 a.popitem()
6 print(a)
结果:
{'数学': 98, '语文': 88, '英语': 95, '化学': 84, '生物': 96, '物理': 97}
{'数学': 98, '语文': 88, '英语': 95, '生物': 96, '物理': 97}
{'数学': 98, '语文': 88, '英语': 95, '生物': 96}
setdefault() 方法:
用来返回某个key对应的value。
语法格式:
dict_name.setdefault(key, defaultvalue)
dict_name 表示字典名称,key 表示键,defaultvalue 表示默认值(可以不写,不写的话是 None).
当指定的 key 不存在时,setdefault() 会先为这个不存在的 key 设置一个默认的 defaultvalue,然后再返回 defaultvalue。
也就是说,setdefault() 方法总能返回指定 key 对应的 value:
如果该 key 存在,那么直接返回该 key 对应的 value;
如果该 key 不存在,那么先为该 key 设置默认的 defaultvalue,然后再返回该 key 对应的 defaultvalue。
示例:
1 a = {"数学": 98, "语文": 88, "英语": 95}
2 print(a)
3 # key不存在,指定默认值
4 a.setdefault('物理', 95)
5 print(a)
6 # key不存在,不指定默认值
7 a.setdefault('化学')
8 print(a)
9 # key存在,指定默认值
10 a.setdefault('数学', 100)
11 print(a)
结果:
{'数学': 98, '语文': 88, '英语': 95}
{'数学': 98, '语文': 88, '英语': 95, '物理': 95}
{'数学': 98, '语文': 88, '英语': 95, '物理': 95, '化学': None}
{'数学': 98, '语文': 88, '英语': 95, '物理': 95, '化学': None}