专栏地址:最强 Python3 基础
公众号:Python 生产力
前言
字典数据类型,从字面意思上来看就是像字典一样查询的数据类型,其中字典分两部分组成,一部分是字典的键(Key),另一部分是键对应的值(Value)。就像我们查字典的时候需要先查目录的索引部分,再根据索引部分再查对应的内容,而这索引部分就是字典的键(Key),内容则是字典的值(Value)。
那这时候可以参考现实中的字典清楚知道,字典的键其实是不能重复的,因为如果字典的键一重复,那我们就不知道这个重复的键到底是我们想要的哪一个,所以类推到计算机中一样,Key 是不能重复的,这中间计算机保持 Key 的唯一性是用独特的哈希算法保持的,这边只需要简单了解一下就行。同时,键(Key)是不可变的,那这时候我们只能使用不可变类型的数据类型了,如字符串、数字等。在一般情况下,Key 都是使用字符串的。
字典的格式由大括号以及键值对组成。可以看下面的例子,一个键值对由键(Key)、冒号、值(Value)组成。键可以是字符串或数字,也可以是不可变类型的元组。
dic1 = {'key1' : 'Python', 'key2' : 123}
dic2 = {1: 123, 2: 'Java', 3: 'Python'}
dic3 = {(1,2): ['Python', 'Java'], (3,): 'C++'}
一、字典操作
1. 查询
字典的查询和列表大同小异,关键的点是字典是使用键(Key)来取相对应的值的,因为一个键只对应一个值(列表这种也算一个值),而且键还是唯一的。所以我们可以根据键来获取相对应的值,而不是像列表等用下标来获取值。注意,这边因为不是用下标来取值,所以也就没有所谓的反向索引了,一切都是用键(Key)来获取。而且要注意的是,键的类型一定要填正确,不正确的类型会保存。
dic1 = {'key1' : 'Python', 'key2' : 123}
dic2 = {1: 123, 2: 'Java', 3: 'Python'}
print(dic1['key1'])
print(dic2[2])
# 输出:
Python
Java
那有的人可能会想,如果键(Key)不是简单的字符串或者数字怎么取值,如键是元组类型。其实都是一样的,如下面的例子,这边的键是元组类型的,那我不管元组里面是什么值,直接把这一整个元组当做一个整体来取值,就相当简单了。不过一般不推荐用这种元组做字典的键。而且,如果元组中有可变类型,则不能用作键(Key)。
dic3 = {(1,2): ['Python', 'Java'], (3,): 'C++'}
print(dic3[(1, 2)])
print(dic3[(3,)])
# 输出:
['Python', 'Java']
C++
如果访问了一个不存在的键值对,则解释器会报错,提示我们键不存在。
dic1 = {'key1' : 'Python', 'key2' : 123}
print(dic1['key3'])
# 输出:
KeyError: 'key3'
2. 修改
字典的更新则是通过修改对应的值方法来修改,而字典的键只能删除或添加,不能做其他更新,因为字典的键是不可变的。
dic1 = {'key1' : 'Python', 'key2' : 123}
dic1['key1'] = 'Java'
print(dic1)
print(dic1['key1'])
# 输出:
{'key1': 'Java', 'key2': 123}
Java
3. 删除
字典键值对的删除可以直接使用 del 关键字,或者使用字典的内置函数 clear() 来清空整个字典。
dic1 = {'key1' : 'Python', 'key2' : 123}
dic2 = {'name' : 'Python', 'price' : 123.00}
del dic1['key1']
dic2.clear()
print(dic1)
print(dic2)
# 输出:
{'key2': 123}
{}
二、内置函数
dic = {'name' : 'Python', 'price' : 123.00}
函数名称 | 形式 | 描述 | 举例 | 结果 |
---|---|---|---|---|
clear | dic.clear() | 清空字典 | dic.clear() | {} |
copy | dic.copy() | 浅拷贝并生成一个新的字典 | dic.copy() | {'name': 'Python', 'price': 123.0} |
popitem | dic.popitem() | 随机返回一个键值对,使用后进先出规则 | dic.popitem() | {'name': 'Python'} |
setdefault | dic.setdefault(key, default=None) | 如果 key 在字典中则返回对应的值,如果不在则将 key 插入字典中并设置默认值 default | dic.setdefault('date', '2021') | {'name': 'Python', 'price': 123.0, 'date': '2021'} |
update | dic.update(dic2) | 将 dic2 的键值对更新到 dic 中 | dic2 = {'date': '2021'} dic.update(dic2) | {'name': 'Python', 'price': 123.0, 'date': '2021'} |
keys | dic.keys() | 返回字典中的所有key的视图 | dic.keys() | dict_keys(['name', 'price']) |
values | dic.values() | 返回字典中的所有value的视图 | dic.values() | dict_values(['Python', 123.0]) |
items | dic.items() | 返回字典的列表视图 | dic.items() | dict_items([('name', 'Python'), ('price', 123.0)]) |
fromkeys | dic.fromkeys(seq[, value]) | 新建一个字典,以seq为键,value为值 | keys = ('key1', 'key2', 'key3') dic.fromkeys(keys, 20) | {'key1': 20, 'key2': 20, 'key3': 20} |
get | dic.get(key) | 获取 key 对应的 value | dic.get('name') | Python |
pop | dic.pop(key) | 删除 key 对应的键值对 | dic.pop('name') | {'price': 123.0} |
总结
字典的操作和其他集合数据类型的有点不一样,是使用键值对来进行操作的,而且字典的键不可以是相同的,相同的情况下插入键值对,后一个值会更新前面一个值。
同时,字典键是不可以使用可变类型的,如列表,虽然可以使用元组作为键,但是如果元组中间接或直接包含了列表,也不可以作为字典的键。