判断第几天/判断第几天(4)

去社区提问

简介:判断第几天’4.0版本,将月份及其对应天数通过字典表示。

案例描述

欢迎来到今天的课堂,这节课我们学习使用字典将月份和对应的天数表示出来。

之前的几节课上,我们认识了Python中列表、元组、集合这几个容器,它们分别有不同的特点,有各自的实用场景。

然而当我们遇到下面的情况应该如何高效存取数据呢?

期末考试结束,老师要存储班级每位同学的成绩,并要求在查找时输入学生姓名就能得到考试分数;

超市系统记录每件商品的库存,可以通过商品名称查找对应货品的库存量;

上面这两种情况中,数据都需要以‘一一对应’的方式来保存。例如‘张三:98分’姓名和分数是一个整体。这一类数据在计算机中需要成对存储,还要能根据关键字(姓名、商品名等)快速查找出与之对应的信息。

我们的新朋友字典就可以很好地解决这类问题,下面就赶快来认识一下它~

案例分析

字典的概念

字典类型(dict)是‘键-值’数据项的组合,每个元素都是一个键值对。

字典类型中一个键对应一个值。通过映射查找数据项,字典的映射可以通过任意键来查找集合中的值。

例如成绩单中有张三、李四、王五这3位同学的信息:

  1. d = {'张三':98,'李四':87,'王五':99}

张三,李四,王五就是字典中的3个‘键’,可以利用它们来确定对应的分数值。

这也就意味这字典中的是唯一的,我们需要利用它来查找值。如果成绩单中有两个’张三‘时,就无法成功查询成绩了。

当然不同的学生可以有相同的分数,假如张三和李四在考试中都得到了98分:

  1. d = {'张三':98,'李四':98,'王五':99}

查询键’张三’得到值98;查询键’李四’也得到值98。

字典类型的数据是无序的,不能像列表和元组一样利用位置顺序来获取元素。

字典中的键唯一,不同键可以拥有相同的值。

在字典中,通过键来查找对应值的形式也十分简单:

例如我们想要获取字典中’张三’的成绩值:

代码练习:

编程区

  1. d = {'张三':98,'李四':98,'王五':99}
  2. d['张三']

终端区

字典的操作

下面我们再来了解字典的相关操作。

  • 向字典增加元素

依然用学生成绩来举例~

定义字典name_grade,存储学生张三和李四的成绩:

  1. name_grade = {'张三':98,'李四':89}

在字典中增加学生王五的成绩信息:

代码练习:

编程区

  1. name_grade = {'张三':98,'李四':89}
  2. name_grade['王五'] = 99
  3. print(name_grade)

终端区

根据上面的例子,我们再将胖虎的成绩添加进去,你可以先思考一下应该如何实现。

代码练习:

编程区

  1. name_grade['胖虎'] = 95
  2. print(name_grade)

终端区

  • 删除字典中的元素

del代表delete,是删除的含义。例如把字典中李四的成绩删除,就可以像下面这样操作:

代码练习:

编程区

  1. del name_grade['李四']
  2. print(name_grade)

终端区

  • 判断key是否在字典中

现在张老师想要知道李四和胖虎的成绩有没有存储在成绩单中,其实也就是判断键是否在字典中,可以这样来完成:

代码练习:

编程区

  1. '李四' in name_grade

终端区

结果返回False,说明李四的信息不在字典中,再来查找胖虎:

代码练习:

编程区

  1. '胖虎' in name_grade

终端区

得到结果True,胖虎的信息是存储在字典中的。

关于字典的简单操作我们就介绍到这里,下面就和我一起看看如何用字典存储月份和天数信息,修改‘判断第几天’的程序。

先来回顾一下上节课的代码:

  1. # 判断第几天3.0
  2. from datetime import datetime
  3. def is_leap_year(year):
  4. # 判断year是否闰年。是,返回True;否,返回False
  5. is_leap = False
  6. if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
  7. is_leap = True
  8. return is_leap
  9. input_date_str = input('请输入日期(yyyy/mm/dd):')
  10. input_date = datetime.strptime(input_date_str, '%Y/%m/%d')
  11. year = input_date.year
  12. month = input_date.month
  13. day = input_date.day
  14. # 包含30天 月份集合
  15. _30_days_month_set = {4, 6, 9, 11}
  16. # 包含31天 月份集合
  17. _31_days_month_set = {1, 3, 5, 7, 8, 10, 12}
  18. # 初始化值
  19. days = 0
  20. days += day
  21. for i in range(1, month):
  22. if i in _30_days_month_set:
  23. days += 30
  24. elif i in _31_days_month_set:
  25. days += 31
  26. else:
  27. days += 28
  28. if is_leap_year(year) and month > 2:
  29. days += 1
  30. print('这是{}年的第{}天。'.format(year, days))

整体的思路和之前基本一致,只是将月份和对应天数用字典存储。首先定义字典month_day_dict

  1. month_day_dict = {1: 31,
  2. 2: 28,
  3. 3: 31,
  4. 4: 30,
  5. 5: 31,
  6. 6: 30,
  7. 7: 31,
  8. 8: 31,
  9. 9: 30,
  10. 10: 31,
  11. 11: 30,
  12. 12: 31}

将1月到month-1月的天数加和,同样使用for循环。前面我们已经学习了字典值的访问方法,字典名[键名]就能得到键的对应值。

  1. # 初始化值
  2. days = 0
  3. days += day
  4. for i in range(1, month):
  5. days += month_day_dict[i]

字典中默认设定2月为28天,当输入年份是闰年并且月份month大于2时,2月应为29天,总天数要在前面计算的基础上加1。这个操作对我们来说也应该非常熟悉啦,直接调用函数用if条件语句来完成。

  1. if is_leap_year(year) and month > 2:
  2. days += 1

把程序补充完整,运行看看结果吧~

  1. from datetime import datetime
  2. def is_leap_year(year):
  3. # 判断year是否闰年。是,返回True;否,返回False
  4. is_leap = False
  5. if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
  6. is_leap = True
  7. return is_leap
  8. input_date_str = input('请输入日期(yyyy/mm/dd):')
  9. input_date = datetime.strptime(input_date_str, '%Y/%m/%d')
  10. year = input_date.year
  11. month = input_date.month
  12. day = input_date.day
  13. # 月份-天数 字典
  14. month_day_dict = {1: 31,
  15. 2: 28,
  16. 3: 31,
  17. 4: 30,
  18. 5: 31,
  19. 6: 30,
  20. 7: 31,
  21. 8: 31,
  22. 9: 30,
  23. 10: 31,
  24. 11: 30,
  25. 12: 31}
  26. # 初始化值
  27. days = 0
  28. days += day
  29. for i in range(1, month):
  30. days += month_day_dict[i]
  31. if is_leap_year(year) and month > 2:
  32. days += 1
  33. print('这是{}年的第{}天。'.format(year, days))

最后再补充一个字典遍历的知识点~

字典的遍历

字典有三种遍历方法,分别是对字典的键遍历、对字典的值遍历、遍历所有的数据项。

  1. 遍历所有的键key

代码练习:

编程区

  1. name_grade = {'张三':98,'李四':98,'王五':99}
  2. for key in name_grade.keys():
  3. print(key)

终端区

  1. 遍历所有的值value

代码练习:

编程区

  1. name_grade = {'张三':98,'李四':98,'王五':99}
  2. for value in name_grade.values():
  3. print(value)

终端区

  1. 遍历所有数据项

代码练习:

编程区

  1. name_grade = {'张三':98,'李四':98,'王五':99}
  2. for item in name_grade.items():
  3. print(item)

终端区

本关总结

今天这节课我们主要学习了字典的相关知识,一起来回顾一下~

  • 字典的概念
  • 字典的操作
  • 字典的遍历
下节预告

恭喜你完成了‘判断第几天’案例的全部课程。下节课开始我们将开启新的旅途~

下一个案例中我们将学习

  • 文件的基本操作
  • 循环结构的控制
  • 面向对象的编程

等重点内容,下节课不见不散!

想要获取课程资料,和更多同学一起交流学习,欢迎添加班主任微信。

扫描二维码添加班主任微信

已经添加班主任的同学无需重复扫码加好友,直接联系对应老师即可。

判断第几天 1/3

判断第几天(4)

1.0x

恭喜完成本课时的学习!
坚持学习

行动力超过

累计学习

学习下一课时