字典是另一种可变容器模型,且可存储任意类型对象。可以和JS的Object 进行联想理解;
字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号( , )分割,整个字典包括在花括号 {} 中 ,格式如下所示:
d = {key1 : value1, key2 : value2, key3 : value3 }
注意: dict 作为 Python 的关键字和内置函数,变量名不建议命名为 dict。
键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字。
一个简单的字典实例:
tinydict = {'name': 'runoob', 'likes': 123, 'url': 'www.runoob.com'}
也可如此创建字典:
tinydict1 = { 'abc': 456 }
tinydict2 = { 'abc': 123, 98.6: 37 }
创建空字典
使用大括号 { } 创建空字典:
# 使用大括号 {} 来创建空字典
emptyDict = {}
# 打印字典
print(emptyDict)
# 查看字典的数量
print("Length:", len(emptyDict))
# 查看类型
print(type(emptyDict))
{}
Length: 0
<class 'dict'>
使用内建函数 dict() 创建字典:
emptyDict = dict()
# 打印字典
print(emptyDict)
# 查看字典的数量
print("Length:",len(emptyDict))
# 查看类型
print(type(emptyDict))
结果
{}
Length: 0
<class 'dict'>
访问字典里的值
把相应的键放入到方括号中,如下实例:
#!/usr/bin/python3
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
print ("tinydict['Name']: ", tinydict['Name'])
print ("tinydict['Age']: ", tinydict['Age'])
结果:
tinydict['Name']: Runoob
tinydict['Age']: 7
如果用字典里没有的键访问数据,会输出错误如下:
#!/usr/bin/python3
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
print ("tinydict['Alice']: ", tinydict['Alice'])
结果
Traceback (most recent call last):
File "test.py", line 5, in <module>
print ("tinydict['Alice']: ", tinydict['Alice'])
KeyError: 'Alice'
修改字典
向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:
#!/usr/bin/python3
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
tinydict['Age'] = 8 # 更新 Age
tinydict['School'] = "菜鸟教程" # 添加信息
print ("tinydict['Age']: ", tinydict['Age'])
print ("tinydict['School']: ", tinydict['School'])
结果
tinydict['Age']: 8
tinydict['School']: 菜鸟教程
删除字典元素
能删单一的元素也能清空字典,清空只需一项操作。
显式删除一个字典用del命令,如下实例:
#!/usr/bin/python3
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
del tinydict['Name'] # 删除键 'Name'
tinydict.clear() # 清空字典
del tinydict # 删除字典
print ("tinydict['Age']: ", tinydict['Age'])
print ("tinydict['School']: ", tinydict['School'])
但这会引发一个异常,因为用执行 del 操作后字典不再存在:
Traceback (most recent call last):
File "/runoob-test/test.py", line 9, in <module>
print ("tinydict['Age']: ", tinydict['Age'])
NameError: name 'tinydict' is not defined
字典键的特性
字典值可以是任何的 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。
两个重要的点需要记住:
1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,如下实例:
#!/usr/bin/python3
tinydict = {'Name': 'Runoob', 'Age': 7, 'Name': '小菜鸟'}
小菜鸟
2)键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行,如下实例:
#!/usr/bin/python3
tinydict = {['Name']: 'Runoob', 'Age': 7}
print ("tinydict['Name']: ", tinydict['Name'])
结果:
Traceback (most recent call last):
File "test.py", line 3, in <module>
tinydict = {['Name']: 'Runoob', 'Age': 7}
TypeError: unhashable type: 'list'
字典内置函数&方法
| 序号 | 函数语法 | 核心作用 | 代码示例 | 补充说明 / 最佳实践 |
|---|---|---|---|---|
| 1 | len(dict) | 统计字典键值对总个数(键的总数) | len({"name":"A","age":18})输出:2 | 判空优先用 if not dict,少用 len(dict)==0 |
| 2 | str(dict) | 将字典转为可打印的字符串格式 | str({"name":"A"})输出:"{'name':'A'}" | 仅用于日志 / 打印展示,不用于反向解析数据 |
| 3 | type(var) | 返回变量原生类型,判断是否为 dict | type({"name":"A"})输出:<class 'dict'> | 类型判断推荐用 isinstance(var, dict),兼容继承 |
| 常用方法 | 核心作用 | 实用示例 | 最佳场景 |
|---|---|---|---|
dict.get(key, 默认值) | 安全取值,键不存在不报错 | d.get("gender","未知") | 业务取值首选,杜绝KeyError |
dict.keys() | 获取所有键 | for k in d.keys(): | 只需要遍历 key 时使用 |
dict.values() | 获取所有值 | sum(d.values()) | 统计数值、只取 value |
dict.items() | 获取所有键值对 | for k,v in d.items(): | 遍历字典标准写法 |
key in dict | 判断键是否存在 | if "name" in d: | 快速校验 key 是否存在 |
内置方法
| 序号 | 方法语法 | 核心功能 | 实操代码案例 | 关键备注 & 最佳实践 |
|---|---|---|---|---|
| 1 | dict.clear() | 清空字典所有元素,保留空字典对象 | d = {"name":"Tom","age":18}``d.clear()结果:{} | 原地清空数据,不生成新字典;清理缓存、重置配置常用 |
| 2 | dict.copy() | 字典浅拷贝,生成新字典 | d1 = {"a":1,"b":[2,3]}``d2 = d1.copy()嵌套列表修改会同步影响原字典 | 单层简单数据够用;嵌套复杂结构用 copy.deepcopy() |
| 3 | dict.fromkeys(seq, val) | 用序列批量创建键,统一赋值初始化 | keys=["name","age"]``d=dict.fromkeys(keys,None)结果:{'name':None,'age':None} | 类方法,直接 dict.xxx 调用;批量初始化字段神器 |
| 4 | dict.get(key, default=None) | 安全取值,键不存在返回默认值,不报错 | d={"name":"Lily"}``d.get("age",0) → 返回0 | 业务取值首选,杜绝 KeyError 程序崩溃 |
| 5 | key in dict | 判断指定键是否存在于字典 | d={"name":"Jack"}``print("name" in d) → True | 查询效率极高,优先用它判断 key 是否存在 |
| 6 | dict.items() | 返回键值对视图,可遍历 (键,值) | for k,v in d.items():``print(k,v) | 遍历字典标准写法,开发最高频 |
| 7 | dict.keys() | 返回所有键的视图对象 | list(d.keys()) → 提取全部 key 转为列表 | 只需要操作、筛选所有键时使用 |
| 8 | dict.setdefault(key, default=None) | 键存在→返回原值;不存在→新增键 + 赋值 | d.setdefault("age",20)无则新增,有则不改 | 分组统计、自动补默认字段专属用法 |
| 9 | dict.update(dict2) | 合并另一个字典,重复 key 直接覆盖 | d1.update(d2)新值覆盖旧值 | 快速合并字典、批量更新配置首选 |
| 10 | dict.values() | 返回所有值的视图对象 | sum(d.values()) → 批量求和计算 | 只统计数值、提取所有值做运算 |
| 11 | dict.pop(key, default) | 删除指定键,返回被删除的值 | res = d.pop("a")``d.pop("c",0)无键返回默认值 | 主动删 key + 拿回数据,可控防报错 |
| 12 | dict.popitem() | 删除并返回末尾一组键值对(3.7 + 有序) | d.popitem() → 返回最后 (key,val) | 后进先出,逐个清理字典尾部数据 |