在 Python 的编程世界里,字典是一种超实用的数据类型,它就像打工人的工作资料夹,能把各种不同类型的信息有条理地存起来,还能快速找到你需要的内容。对于刚开始学习编程的小伙伴来说,掌握字典的用法,能让你在处理数据时更加得心应手。
一、字典的定义
为什么叫字典,我们先看看生活种的字典长啥样
在生活种的字典里,都是一个个字,后边跟着它的含义,同样的,在python里的字典就是一个个key对应value,也称为键值对。
为什么需要到字典这种数据容器,比如说,公司里的牛马,叫张三、翠花、mary的,他们都有绩效,就需要到键值对,名字就是key,绩效就是value。
字典是一种可变容器模型,可以存储任意类型的对象。它由一个个键值对(key=>value)组成,每个键值对之间用逗号分隔,键和值之间用冒号分隔,整个字典用花括号 {}
括起来
定义一个字典:
变量名 = {key:value, key:value, key:value, ... , key:value}
定义一个空字典:
变量名 = {}
变量名 = dict()
注意:我们前面提到的集合和字典都是用大括号,提到集合不能直接使用{}的方式定义空集合,因为这个功能给字典使用了
比如,记录一位员工的基本信息:
employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
print(employee_info)
# {'name': '小李', 'age': 25, 'position': '程序员'}
这里的 'name'
'age'
'position'
就是键,'小李'
25
'程序员'
就是对应的值。
需要注意的是,字典的键必须是唯一的,但值可以重复;而且键必须是不可变的数据类型,像字符串、数字、元组就可以当键,列表就不行。
创建空字典也很简单,有两种方法:
- 使用大括号
{}
:empty_dict1 = {} print(empty_dict1) # {}
- 使用内建函数
dict()
:empty_dict2 = dict() print(empty_dict2) # {}
二、访问字典里的值
想要查看员工的年龄,只要把对应的键 'age'
放到方括号里,就像在资料夹里找特定文件一样,如下所示:
employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
print(employee_info['age']) # 25
不过,如果用字典里没有的键去访问数据,就会报错,就像在资料夹里找一份不存在的文件,肯定找不到呀:
employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
print(employee_info['salary'])
# KeyError: 'salary'
运行这段代码,会看到报错信息,提示找不到 'salary'
这个键。
三、修改字典
在员工信息管理过程中,员工的信息可能会发生变化,比如小李升职了,这时候就需要修改字典里的数据。向字典添加新内容或者修改已有内容,都是通过增加或改变键值对来实现的。例如:
employee_info = {'name': '小李', 'age': 25, 'position': '程序员'}
employee_info['age'] = 26 # 小李过生日,年龄加1
employee_info['department'] = '技术部' # 增加部门信息
print(employee_info)
# {'name': '小李', 'age': 26, 'position': '程序员', 'department': '技术部'}
四、删除字典元素
如果有员工离职了,就需要从字典里删除相应的信息。可以删除单一的键值对,也能清空整个字典。
- 删除单一元素,用
del
命令:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} del employee_info['position'] # 删除职位信息 print(employee_info) # {'name': '小李', 'age': 25}
- 清空字典,使用
clear()
方法:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} employee_info.clear() # 清空字典 print(employee_info) # {}
- 删除整个字典,也是用
del
命令:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} del employee_info # 删除字典 print(employee_info) # NameError: name 'employee_info' is not defined
执行最后一行代码会报错,因为字典已经被删除,不存在了。同时,IDE里也会出现黄色警告的
五、字典键的特性
- 键的唯一性:字典里不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会覆盖前一个值。例如:同时,IDE里也会出现黄色警告的
employee_info = {'name': '小李', 'name': '李华'} print(employee_info['name']) # 李华
- 键的不可变性:键必须是不可变的,所以可以用数字、字符串或元组充当键,但列表不行。例如:
employee_info = {['name']: '小李', 'age': 25} # TypeError: unhashable type: 'list'
运行这段代码会报错,因为列表是可变的,不能作为字典的键。
六、字典内置函数和方法
Python 为字典提供了很多内置函数和方法,方便我们操作字典。
6.1 内置函数
len(dict)
:计算字典元素个数,也就是键的总数。比如统计员工信息字典里有多少条信息:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} print(len(employee_info)) # 3
str(dict)
:把字典转换成可以打印的字符串形式,方便查看字典内容,比如显示到界面上:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} print(str(employee_info)) # {'name': '小李', 'age': 25, 'position': '程序员'}
6.2 内置方法
dict.clear()
:删除字典内所有元素,前面已经介绍过啦。dict.copy()
:返回一个字典的浅复制。比如你想备份一份员工信息字典:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} backup_info = employee_info.copy() print(backup_info) # {'name': '小李', 'age': 25, 'position': '程序员'}
dict.fromkeys()
:创建一个新字典,用序列中的元素作为字典的键,val
为所有键对应的初始值。假设公司新来了一批员工,职位都一样,可以这样创建字典:new_employees = ['小张', '小王', '小赵'] new_employee_dict = dict.fromkeys(new_employees, '实习生') print(new_employee_dict) # {'小张': '实习生', '小王': '实习生', '小赵': '实习生'}
dict.get(key, default=None)
:返回指定键的值,如果键不在字典中,就返回设置的默认值。比如查看员工的薪资,如果没有薪资信息,就返回默认值 0:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} salary = employee_info.get('salary', 0) print(salary) # 0
key in dict
:判断键是否在字典里,如果在返回True
,否则返回False
。比如判断员工字典里有没有'age'
这个键:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} print('age' in employee_info) # True
dict.items()
:以列表形式返回一个视图对象,包含字典的所有键值对。遍历员工信息字典,打印每个键值对:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} for key, value in employee_info.items(): print(f"{key}: {value}") # name: 小李 # age: 25 # position: 程序员
dict.keys()
:返回一个视图对象,包含字典的所有键。获取员工信息字典里所有的键:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} keys = employee_info.keys() print(keys) # dict_keys(['name', 'age', 'position'])
在 Python3.x 中,
dict.keys()
返回的是dict_keys
对象,如果需要转换成列表,可以使用list(dict.keys())
。employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} keys = employee_info.keys() keys_list = list(keys) print(keys) print(keys_list) # dict_keys(['name', 'age', 'position']) # ['name', 'age', 'position']
dict.setdefault(key, default=None)
:和get()
类似,但如果键不存在于字典中,会添加键并将值设为默认值。比如获取员工的部门信息,如果没有部门信息,就添加并设为'未分配'
:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} department = employee_info.setdefault('department', '未分配') print(department) print(employee_info) # 未分配 # {'name': '小李', 'age': 25, 'position': '程序员', 'department': '未分配'}
dict.update(dict2)
:把另一个字典的键值对更新到当前字典里。假设又获取了一些员工的其他信息,要更新到原来的字典里:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} extra_info = {'salary': 5000, 'department': '技术部'} employee_info.update(extra_info) print(employee_info) # {'name': '小李', 'age': 25, 'position': '程序员', 'salary': 5000, 'department': '技术部'}
dict.values()
:返回一个视图对象,包含字典的所有值。获取员工信息字典里所有的值:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} values = employee_info.values() print(values) # dict_values(['小李', 25, '程序员'])
在 Python3.x 中,
dict.values()
返回的是dict_values
对象,如果需要转换成列表,可以使用list(dict.values())
。employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} values = employee_info.values() print(values) values_list = list(values) print(values_list) # dict_values(['小李', 25, '程序员']) # ['小李', 25, '程序员']
pop(key[,default])
:删除字典中指定键所对应的值,返回被删除的值。比如员工离职,删除其信息并返回职位信息:employee_info = {'name': '小李', 'age': 25, 'position': '程序员'} position = employee_info.pop('position') print(position) print(employee_info) # 程序员 # {'name': '小李', 'age': 25}
七、字典的其他应用场景
7.1 字典嵌套:
字典可以支持无限极嵌套。比如记录公司不同城市的办公地点及对应的部门信息:
company_offices = {
'北京': {
'研发部': ['朝阳区', '海淀区'],
'市场部': ['东城区']
},
'上海': {
'研发部': ['浦东新区'],
'销售部': ['徐汇区', '闵行区']
}
}
print(company_offices['北京']['研发部'])
# ['朝阳区', '海淀区']
这样就能通过层层索引,获取具体的信息,比如查看北京研发部的办公地点
7.2 字典推导式:
和列表推导式类似,字典也有推导式,能更简洁地创建字典。格式是 {key:value for variable in iterable [if expression]}
。比如创建一个字典,键是 1 到 5 的数字,值是数字的平方:
square_dict = {num: num ** 2 for num in range(1, 6)}
print(square_dict)
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
7.3 字典实现分支需求:
在编程中,有时候需要根据不同的条件执行不同的操作,用字典可以很方便地实现。比如根据 HTTP 状态码返回不同的提示信息:
def status(code):
status_dict = {
400: "Bad request",
404: "Not found"
}
return status_dict.get(code, "Unknown status code")
print(status(400))
print(status(404))
print(status(200))
# Bad request
# Not found
# Unknown status code