自学Python第11天:字典——我终于能让程序像查字典一样找东西了
前面学过的列表和元组都是按顺序存数据的。想找到某个数据得知道它的位置下标。但有些场景不适合用列表。比如我想存一个班级学生的成绩用列表的话是这样students [张三, 李四, 王五] scores [85, 92, 78]想查张三的成绩得先找到张三所在列表里的位置再去成绩列表里找同一个位置的数据非常麻烦。今天就来学字典——一种用名字来找值的数据容器就像查字典一样方便。一、字典是什么想象一下你手机上的通讯录。你不会说第3个人是谁而是直接说张三的电话是多少。通讯录就是通过联系人姓名找到电话号码的。字典就是程序里的通讯录——它用键(Key)来查找对应的值(Value)。在Python里字典用花括号{}表示每一对数据由键和值组成用冒号:连接多对数据用逗号隔开# 键 值 键 值 键 值 student {name: 张三, age: 18, city: 北京}键是查找的依据值是要找的数据。键必须是不可变类型——比如字符串、数字、元组。列表是可变类型不能作为字典的键这个坑我们后面会专门讲。二、根据键获取值想拿到字典里的某个值用字典名[键]:student {name: 张三, age: 18, city: 北京} print(student[name]) # 张三 print(student[age]) # 18三、一个我踩过的坑KeyError如果访问一个不存在的键Python会报错student {name: 张三, age: 18} print(student[city])运行后报错KeyError: city因为字典里没有city这个键所以找不到。每次访问字典之前最好确认你用的键是存在的。四、字典的常用操作1.新增或修改直接给一个键赋值如果键不存在就新增如果键已存在就覆盖student {name: 张三, age: 18} # 新增一个键值对 student[city] 北京 print(student) # {name: 张三, age: 18, city: 北京} # 修改已有的键的值 student[age] 19 print(student) # {name: 张三, age: 19, city: 北京}2.删除:pop()删除指定的键值对student {name: 张三, age: 18, city: 北京} student.pop(city) print(student) # {name: 张三, age: 18}3.安全取值get()用get()方法可以在键不存在时返回一个默认值而不是报错student {name: 张三, age: 18} print(student.get(city)) # None print(student.get(city, 未知)) # 未知4.查看所有键、所有值、所有键值对student {name: 张三, age: 18, city: 北京} print(student.keys()) # dict_keys([name, age, city]) print(student.values()) # dict_values([张三, 18, 北京]) print(student.items()) # dict_items([(name, 张三), (age, 18), (city, 北京)])keys()、values()、items() 返回的是视图对象可以直接用于循环遍历但不能像列表那样直接按下标访问。如果需要下标访问可以用 list() 转换后使用但实际场景中通常直接遍历就够了。五、遍历字典1.遍历所有键值对最常用student {name: 张三, age: 18, city: 北京} for key, value in student.items(): print(f{key}: {value})运行结果name: 张三 age: 18 city: 北京2.只遍历键for key in student.keys(): print(key)3.只遍历值for value in student.values(): print(value)六、一个我踩过的坑列表不能作为字典的键前面提到过字典的键必须是不可变类型。列表是可变的所以不能当键# 错误示范 d {[a, b]: 这是列表当键} # 报错运行后会报 TypeError: unhashable type: list。因为列表的内容可以随时增删改Python无法保证它稳定可用。但元组可以作为键因为元组是不可变的d {(a, b): 这是元组当键} print(d[(a, b)]) # 这是元组当键七、列表VS字典场景推荐用原因按编号/顺序存取数据列表按位置查找速度快按名字/ID查找数据字典键值对应查找方便数据是一组固定字段字典每个字段有名字代码可读性高数据需要频繁增删改列表或字典都可以两者都支持看需求八、综合示例学生成绩管理系统把今天学的东西串起来# 用字典存储学生信息 students {} while True: print(\n--- 学生成绩管理系统 ---) print(1. 添加学生) print(2. 查看所有学生) print(3. 查询学生成绩) print(4. 删除学生) print(5. 退出) choice input(请选择) if choice 1: name input(请输入姓名) score input(请输入成绩) students[name] score print(添加成功) elif choice 2: if len(students) 0: print(暂无学生数据) else: for name, score in students.items(): print(f{name}{score}分) elif choice 3: name input(请输入要查询的姓名) score students.get(name) if score is None: print(未找到该学生) else: print(f{name}的成绩是{score}分) elif choice 4: name input(请输入要删除的姓名) if name in students: students.pop(name) print(删除成功) else: print(未找到该学生) elif choice 5: print(再见) break else: print(无效选择请重新输入)这段代码包含了今天学的·字典的定义students {}·新增/修改students[name] score·查询students.get(name)·删除students.pop(name)·遍历for name, score in students.items()小结今天学的东西整理成一张速查表