七、字典
本章内容运行环境:
Jupyter Notebook
本单元视频链接:https://v.youku.com/v_show/id_XNDYyOTMzMjQ0MA==.html
7.1 字典定义
字典是一组无序键值对的集合
假设我们在一个英语网站学习,每天会背单词、做听力、做阅读。现在有一组数据:你背了单词(bdc) 30个;做了听力(listen)5句;做了阅读(read)2篇。我们可以创建一个study
的字典将它们存放:
study = {"bdc":30, "listen":5, "read":2}
- 字典用 {} 包裹
- 其中
"bdc" : 30
为一对键值对,其中"bdc"
为键(key),30
为值(value) - 每对键值对由英文逗号
,
隔开 - 最好在每一个逗号与下一个键值对之间用空格相隔,方读代码。
7.2 创建字典
在 Python 字典中:
键可以是字符串,也可以是数值
值可以是任何数据类型:字符串、数值、列表,甚至还可以是字典
shanbey = {"study": {"bdc": {"num_today": 25, "used_time": 5.0}, "listen": {"num_today": 0,"used_time": 0}}}
print(shanbey)
这边展示了一个字典,value还是字典的例子(一般网页数据都长这样)。我们拆解一下这个字典
"study":
{
"bdc":
{
"num_today": 25,
"used_time": 5.0
},
"listen":
{
"num_today": 0,
"used_time": 0
}
}
空字典
study = {}
type(study)
# 输出:dict
合并列表
zip()
创建字典:用zip() 将两个列表合并为一个字典
name = ["bdc", "listen", "read", "sentence"]
number = [30, 5, 2, 10]
zip_study = zip(name, number)
study = {key:value for key,value in zip_study}
print(study)
# 输出:{'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
先用zip()
将列表 name
和 number
合并在变量zip_study
中。(在【4.3 列表】里讲过zip的用法)
接着,遍历 zip_study
,把name
作为key,number
作为值
key:value for key,value in zip_study
这用到了我们之前提到的列表推导式(5.2节),我们可以把这行代码分开,理解为
for key,value in zip_study:
key:value #这是字典组成的样子
7.3 为字典添加键
添加新键:用以下语句为字典添加新键
study = {'bdc': 30, 'listen': 5, 'read': 2}
# 字典[新键] = 新值
study['sentence'] = 10
print(study)
# 输出:{'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
.update()
:用 .update() 一次性向字典加入多对键值对
study = {'bdc': 30}
study.update({ 'listen': 5, 'read': 2, 'sentence': 10})
print(study)
# 输出:{'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
更新字典值:如果有一个键对应的值需要变动,用添加键时的方法,重新为该键赋新值
study = {'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
study['sentence'] = 200
print(study)
# 输出:{'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 200}
7.4 字典取值
可以通过字典的键来获取其对应的值:字典[键]
study = {'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
print(study['sentence'])
# 输出:10
字典无效键:当取字典键值时,如果键并不存在于字典中,该键无效,计算机会返回错误。
study = {'listen': 5, 'read': 2, 'sentence': 10}
print(study['bdc'])
# KeyError: 'bdc' ,系统会报错
.get()
:根据键来取字典中相应的值
如果键不存在于字典中,.get() 默认返回 None
当键不存在于字典中时,也可以手动设置返回值
study = {'listen': 5, 'read': 2, 'sentence': 10}
print(study.get('listen')) # 输出:5
print(study.get('bdc')) # 输出:None
print(study.get('bdc','没有背单词')) # 输出:没有背单词
7.5 try 和 except
try
和 except
条件判断,帮助检查代码中可能存在的错误
计算机会先执行 try
条件下的语句,一旦出现例外情况,比如错误 NameError 或者 ValueError,计算机会终止执行 try
条件下的语句,并且当该例外情况满足 except
中指定的条件,计算机会执行except
中的语句。
try/except
取值:如果字典中没有相应的键,还可以用try/except
的方法来捕获 KeyError
的出现。
study = {'listen': 5, 'read': 2, 'sentence': 10}
try:
print(study['bdc'])
except:
print("没有背单词")
# 输出:没有背单词
7.6 删除字典键
.pop()
:删除字典中的键及其值
如果需要删除的键不在字典之中,在 .pop() 方法中加上对应的参数,.pop() 返回该参数
study = {'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
print(study.pop('sentence')) # 输出:10
print(study)
# 输出:{'bdc': 30, 'listen': 5, 'read': 2}
7.7 获取所有的键和值
获取字典所有的键
我们可以用两种方法获得字典中所有的键。
list(目标字典)
:
study = {'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
print(list(study))
# ['bdc', 'listen', 'read', 'sentence']
.keys()
:
study = {'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
for name in study.keys():
print(name)
# 输出:
bdc
listen
read
sentence
列表推导式
study = {'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
name = [key for key in study.keys()]
print(name)
# 输出:['bdc', 'listen', 'read', 'sentence']
获得字典所有的值
.values()
获得字典中所有的值
study = {'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
for number in study.values():
print(number)
# 输出:
30
5
2
10
列表推导式
study = {'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
number = [value for value in study.values()]
print(number)
# 输出:[30, 5, 2, 10]
获得字典中所有的键值对
用.items()
获取字典中的所有键值对
study = {'bdc': 30, 'listen': 5, 'read': 2, 'sentence': 10}
for key,value in study.items():
print("学习"+key+"的数量为"+str(value))
# 输出:
# 学习bdc的数量为30
# 学习listen的数量为5
# 学习read的数量为2
# 学习sentence的数量为10
7.8 字典所有方法
dir(dict)
'clear',
'copy',
'fromkeys',
'get', # 根据键来取字典中相应的值
'items', # 获取字典中的所有键值对
'keys', # 获取字典中的所有键
'pop', # 删除
'popitem',
'setdefault',
'update', # 更新多对键值对
'values' # 获取字典中的所有值
7.9 实践:清洗扇贝打卡数据
清洗扇贝打卡数据
扇贝打卡数据:https://www.shanbay.com/api/v1/checkin/user/------/ ,最后一部分,是你的扇贝ID
import requests # 导入requests模块
ID = "16888030" # 扇贝ID
web = "https://www.shanbay.com/api/v1/checkin/user/"+str(ID)+"/" # 网址:打卡记录
res = requests.get(web) # requests发起请求,静态网页用get
LearningData = res.json() # LearningData就是字典格式
NickName = LearningData['data'][0]['user']['nickname'] # 获取昵称
for LearningDataDaily in LearningData['data']:
checkin_date = LearningDataDaily['checkin_date']
try:
bdc_num_today = LearningDataDaily['stats']['bdc']['num_today']
bdc_used_time = LearningDataDaily['stats']['bdc']['used_time']
except:
bdc_num_today = 0
bdc_used_time = 0.0
print("{},{}背单词{}个,用时{}分钟".format(checkin_date,NickName,bdc_num_today,bdc_used_time))
# 输出:
2020-04-09,洋阳背单词25个,用时5.0分钟
2020-04-08,洋阳背单词25个,用时28.0分钟
2020-04-07,洋阳背单词45个,用时6.0分钟
2020-04-06,洋阳背单词25个,用时19.0分钟
2020-04-05,洋阳背单词25个,用时6.0分钟
2020-04-04,洋阳背单词25个,用时6.0分钟
2020-04-03,洋阳背单词25个,用时6.0分钟
2020-04-02,洋阳背单词25个,用时17.0分钟
2020-04-01,洋阳背单词0个,用时0.0分钟
2020-03-31,洋阳背单词25个,用时15.0分钟
2020-03-30,洋阳背单词25个,用时7.0分钟
2020-03-29,洋阳背单词25个,用时10.0分钟
2020-03-28,洋阳背单词0个,用时0.0分钟
2020-03-27,洋阳背单词25个,用时8.0分钟
2020-03-26,洋阳背单词25个,用时15.0分钟
2020-03-25,洋阳背单词25个,用时12.0分钟
2020-03-24,洋阳背单词25个,用时13.0分钟
2020-03-23,洋阳背单词25个,用时67.0分钟
2020-03-22,洋阳背单词0个,用时0.0分钟
2020-03-21,洋阳背单词0个,用时0.0分钟
请在作业的最后一行输出:
昵称:第6节课作业