Python自学成才(番外篇6)|dict提供的内置函数
上一篇我们将了字典基础的增删改查操作,也提到了用一些字典的内置函数来实现相关操作。
但是 dict 的内置函数远不止如此,在遇到需要批量添加、合并、提取数据、条件判断等场景时,仍然有一些便捷的内置函数帮你快速实现。
keys / values 的提取
💡 注意:标题用的是 key 和 value 的复数形式,也就是说把所有的 key 和 value 提取出来。
获取所有的键:keys()
info = {"name": "RainBomb", "age": 18}print(info.keys())# Output: dict_keys(['name', 'age'])
💡 注意:返回值是 dict_keys,外表形似 list,但是却有本质的不同,如需进行如排序、下标取值等操作,需先使用强制类型转换为 list:
keys_list = list(info.keys())
获取所有的值:values()
info = {"name": "RainBomb", "age": 18}print(info.values())# Output: dict_values(['RainBomb', 18])
💡 注意:同样注意,返回的是 dict_values 为非 list。
获取所有的键值对:items()
在上一篇我们讲解创建 dict 的时候,就提到可以使用元组列表的形式。因此,在获取 dict 中的内容时,我们也可以使用键值对元组的形式进行提取:
info = {"name": "RainBomb", "age": 18}print(info.items())# Output: dict_items([('name', 'RainBomb'), ('age', 18)])for key, value in info.items():print(key, value)# Output: name RainBomb# Output: age 18
💡 注意:键值对二元元组遵从前 key 后 value 的原则。
新增、字典合并、批量赋值
非覆盖新增:setdefault()
前一篇我们讲到,可以使用中括号的形式新增键值对,当 key 存在时则新增操作变为更新覆盖 value 的操作。这在很多场景是不便利的,容易触发错误更新。
dict.setdefault(key, value) 则能避免这个错误,它会检测 dict 中是否已有 key,如果存在则不作修改,否则使用 key 和 value 新增:
info = {"name": "RainBomb", "age": 18}info.setdefault("gender", "male")print(info)# Output: {'name': 'RainBomb', 'age': 18, 'gender': 'male'}info.setdefault("age", 20)print(info)# Output: {'name': 'RainBomb', 'age': 18, 'gender': 'male'}
多个字典合并:update()
当要将多个字典合并时,可以使用内置的 update() 函数,以被合并字典作为调用者,带合并字典作为参数传递给该函数:
d1 = {"name": "RainBomb"}d2 = {"age": 18}d1.update(d2)print(d1)# Output: {'name': 'RainBomb', 'age': 18}
延续上例子:当 d2 中存在与 d1 中重复的 key 时,update 函数会将 d2 中对应的内容更新覆盖给 d1:
d1 = {"name": "RainBomb"}d2 = {"name": "Rain--Bomb", "age": 18}d1.update(d2)print(d1)# Output: {'name': 'Rain--Bomb', 'age': 18}
复制与初始化
使用 copy() 进行浅拷贝
先说说引用、浅拷贝和深拷贝的区别:
- 引用是对某个变量起一个别名,就好比我们的昵称,由于其代表相同的内容,因此对内容的修改会直接体现在任意一个与之相关的变量名称上。
- 浅拷贝只复制某个对象的地址,而不复制对象本身,新旧对象还是共享同一块内存,对原内容的修改会影响到拷贝内容。
- 深拷贝则创建相同但不存储于同一内存的对象,对原内容的修改仅作用于原内容。
dict 提供的 copy() 是一种浅拷贝的操作,但是其深拷贝父对象(一级目录),子对象(二级目录)不拷贝还是引用,所以在使用时需要注意:
dict1 = {'user': 'RainBomb', 'num':[1, 2, 3]}dict2 = dict1dict3 = dict1.copy()dict1['user']='root'dict1['num'].remove(1)print(dict1)# Output: {'user': 'root', 'num': [2, 3]}print(dict2)# Output: {'user': 'root', 'num': [2, 3]}print(dict3)# Output: {'user': 'RainBomb', 'num': [1, 2, 3]}
dict 的 copy() 有些不好理解,大家可以多用几个例子测试一下。
字典键值对批量生成
当给定 keys 序列时,如果我们要对所有 key 的 value 使用相同内容进行初始化,一种操作是:
key_list = ["name", "age", "gender"]info = {}for key in key_list: info[key] = Noneprint(info)# Output: {'name': None, 'age': None, 'gender': None}
使用了 for 循环,显然不够满足 python 对优雅的要求。因此,我们可以用 fromkeys() 批量统一设置初始值:
key_list = ["name", "age", "gender"]info = dict.fromkeys(key_list, None)print(info)# Output: {'name': None, 'age': None, 'gender': None}
往期回顾:
Python的字符串驻留机制,内存优化产生的小心思
用OpenCV去除图像噪声增强细节 | Part.10
为什么程序员偏爱Dark Mode(深色模式)
dict的增删查改|Python自学成才(番外篇5)
用OpenCV来实现简单的人脸检测 | Part.9