11 python 数据类型 | 字典

0 阅读5分钟

字典是另一种可变容器模型,且可存储任意类型对象。可以和JS的Object 进行联想理解;

字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号( , )分割,整个字典包括在花括号 {} 中 ,格式如下所示:

d = {key1 : value1, key2 : value2, key3 : value3 }

注意: dict 作为 Python 的关键字和内置函数,变量名不建议命名为 dict

py-dict-3.png

键必须是唯一的,但值则不必。

值可以取任何数据类型,但键必须是不可变的,如字符串,数字。

一个简单的字典实例:

tinydict = {'name': 'runoob', 'likes': 123, 'url': 'www.runoob.com'}

py-dict-2.png

也可如此创建字典:

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'

字典内置函数&方法

序号函数语法核心作用代码示例补充说明 / 最佳实践
1len(dict)统计字典键值对总个数(键的总数)len({"name":"A","age":18})输出:2判空优先用 if not dict,少用 len(dict)==0
2str(dict)将字典转为可打印的字符串格式str({"name":"A"})输出:"{'name':'A'}"仅用于日志 / 打印展示,不用于反向解析数据
3type(var)返回变量原生类型,判断是否为 dicttype({"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 是否存在

内置方法

序号方法语法核心功能实操代码案例关键备注 & 最佳实践
1dict.clear()清空字典所有元素,保留空字典对象d = {"name":"Tom","age":18}``d.clear()结果:{}原地清空数据,不生成新字典;清理缓存、重置配置常用
2dict.copy()字典浅拷贝,生成新字典d1 = {"a":1,"b":[2,3]}``d2 = d1.copy()嵌套列表修改会同步影响原字典单层简单数据够用;嵌套复杂结构用 copy.deepcopy()
3dict.fromkeys(seq, val)用序列批量创建键,统一赋值初始化keys=["name","age"]``d=dict.fromkeys(keys,None)结果:{'name':None,'age':None}类方法,直接 dict.xxx 调用;批量初始化字段神器
4dict.get(key, default=None)安全取值,键不存在返回默认值,不报错d={"name":"Lily"}``d.get("age",0) → 返回0业务取值首选,杜绝 KeyError 程序崩溃
5key in dict判断指定键是否存在于字典d={"name":"Jack"}``print("name" in d)True查询效率极高,优先用它判断 key 是否存在
6dict.items()返回键值对视图,可遍历 (键,值)for k,v in d.items():``print(k,v)遍历字典标准写法,开发最高频
7dict.keys()返回所有键的视图对象list(d.keys()) → 提取全部 key 转为列表只需要操作、筛选所有键时使用
8dict.setdefault(key, default=None)键存在→返回原值;不存在→新增键 + 赋值d.setdefault("age",20)无则新增,有则不改分组统计、自动补默认字段专属用法
9dict.update(dict2)合并另一个字典,重复 key 直接覆盖d1.update(d2)新值覆盖旧值快速合并字典、批量更新配置首选
10dict.values()返回所有值的视图对象sum(d.values()) → 批量求和计算只统计数值、提取所有值做运算
11dict.pop(key, default)删除指定键,返回被删除的值res = d.pop("a")``d.pop("c",0)无键返回默认值主动删 key + 拿回数据,可控防报错
12dict.popitem()删除并返回末尾一组键值对(3.7 + 有序)d.popitem() → 返回最后 (key,val)后进先出,逐个清理字典尾部数据