week2day3:字典
一.认识字典
1.字典和列表的选择
需要保存多个数据的时候,如果多个数据的意义相同(不需要区分)使用列表;
如果多个数据的意义不同就使用字典。
2.认识字典
#类型
(1) 是容器型数据类型
(2) 将{}作为容器的标准,里面多个键值对用逗号隔开:{键1:值1,键2:值2,…}。
键值对的格式: 键:值,
(3)) 空字典:dict1={}
(4)字典中的元素只能是键值对
#特点
(5)字典是可变的(支持增删改查);字典是无序(不支持下标,元素顺序不影响结果)
#对元素的要求
(6))字典的元素是键值对
(7)键的要求:a.键必须是不可变的数据类型(数字,字符串,布尔,元组等)
b.键是唯一的
(8))值的要求:没有要求
二.字典的基本操作
1.查 - 获取字典的值
(1) 查单个(重要) - 一次获取一个值
语法1:字典[键] - 获取字典中指定键对应的值(获取不存在的键时会报错)
dog={'name':'旺财','age':3,'breed':'中华田园犬','color':'白色'}
print(dog['age']) #3
print(dog['name']) #旺财
语法2:字典.get(键) - 获取字典中指定键对应的值(如果不存在该键,不会报错,返回空值)
字典.get(键,默认值) - 当键不存在时,返回默认值
(2) 遍历
语法1: for 变量 in 字典:
pass (获取字典的键)
语法二:for 键,值 in 字典.itmes():
pass (同时获取键和值)
2.增/改 - 添加键值对
(1) 字典[键]=值 如果键存在就修改指定键对应的值;如果键不存在就添加键值对
(2) 字典.setdefault(键,值) 添加键值对(如果键不存在就添加键值对,如果存在就不修改)
3.删 - 删除键值对
(1)del 字典[键] — 删除指定键对应的键值对
(2)字典.pop() — 取出指定的键对应的值
三.字典相关操作和函数
1.相关运算
(1) 字典不支持:=,*,<,>,>=,<= (只支持==,!=)
(2) in 和 not in -判断的是字典中是否存在指定的键(不是判断值或者键值对)
2.相关函数
(1)len(字典) - 获取字典中键值对的个数
(2)dict(数据) - 将其他类型的数据转换为字典
转换条件:① 数据本身是一个序列
② 序列的元素必须都是有且只有两个元素的小序列,并且其中第一个元素是不可变的数据
3.相关方法
(1)字典.clear()
(2)字典.copy()
(3)字典.keys() - 返回一个序列,序列中的元素是字典所有的键
(4)字典.values()-返回一个序列,序列中的元素是字典所有的值
(5)字典.items() - 返回一个序列,序列中的元素是由每一对键和值组成的元组
(6)字典.update(序列) - 将可以转化为字典的序列中的元素全部添加到字典中
4.字典推导式
语法1:{表达式(键):表达式(值) for 变量 in 序列}
语法2:{表达式(键):表达式(值) for 变量 in 序列 if 条件语句}
housework
-
定义一个变量保存一个学生的信息,学生信心中包括:姓名、年龄、成绩(单科)、电话、性别
dict1={'name':'小明','age':18,'score':100,'tel':138231,'gender':'男'} print(dict1)
-
定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )
all_students=[ {'name':'小明','age':18,'score':100,'tel':'138238','gender':'男'}, {'name':'小红','age':16,'score':85,'tel':'133251','gender':'女'}, {'name':'小蓝','age':22,'score':80,'tel':'134228','gender':'女'}, {'name':'小王','age':18,'score':80,'tel':'135231','gender':'性别不明'}, {'name':'小宋','age':17,'score':45,'tel':'136431','gender':'男'}, {'name':'小李','age':16,'score':100,'tel':'138231','gender':'男'} ]
-
统计不及格学生的个数
num=len([x['score'] for x in all_students if x['score']<60]) print(num)
-
打印不及格未成年学生的名字和对应的成绩
list1={x['name'] :x['score'] for x in all_students if x['score']<60 and x['age']<18} print(list1)
-
求所有男生的平均年龄
age=[x['age'] for x in all_students if x['gender']=='男'] average_age=sum(age)/len(age) print(average_age)
-
打印手机尾号是8的学生的名字
list1=[x['name'] for x in all_students if int(x['tel'])%10==8] print(list1)
-
打印最高分和对应的学生的名字
max_score=0 names={} for stu in all_students: if stu['score']==max_score: names.setdefault(stu['name'],stu['score']) elif stu['score']>max_score: max_score = stu['score'] names.clear() names.setdefault(stu['name'],stu['score']) print(names)
-
删除性别不明的所有学生
new_students=[x for x in all_students if x['gender']=='女' or x['gender']=='男'] print(new_students)
-
将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
new_students=[] score=[0] for index1,stu in enumerate(all_students): count = 0 for index2 in range(index1+1): if stu['score']<score[index2]: count+=1 new_students.insert(count,stu) score.append(stu['score']) print(new_students)
-
-
定义一个变量保存一个班级的信息,班级信息中包括:班级名称、教室位置、班主任信息、讲师信息、班级所有的学生(根据实际情况确定数据类型和具体信息)
class1={ 'class_name':"python2201", 'class_dress':'千峰3楼', 'class_teacher':{'name':'张瑞燕', 'tel':'123214', 'age':18}, 'lecturer' :{'name':'余婷', 'tel':'12233214', 'age':18}, 'students':[ {'name':'小明','age':18,'score':100,'tel':'138238','gender':'男'}, {'name':'小红','age':16,'score':85,'tel':'133251','gender':'女'}, {'name':'小蓝','age':22,'score':30,'tel':'134228','gender':'女'}, {'name':'小王','age':18,'score':80,'tel':'135231','gender':'性别不明'}, {'name':'小宋','age':17,'score':45,'tel':'136431','gender':'男'}, {'name':'小李','age':16,'score':100,'tel':'138231','gender':'男'} ] } print(class1)
-
已知一个列表保存了多个狗对应的字典:
dogs = [ {'name': '贝贝', 'color': '白色', 'breed': '银狐', 'age': 3, 'gender': '母'}, {'name': '花花', 'color': '灰色', 'breed': '法斗', 'age': 2}, {'name': '财财', 'color': '黑色', 'breed': '土狗', 'age': 5, 'gender': '公'}, {'name': '包子', 'color': '黄色', 'breed': '哈士奇', 'age': 1}, {'name': '可乐', 'color': '白色', 'breed': '银狐', 'age': 2}, {'name': '旺财', 'color': '黄色', 'breed': '土狗', 'age': 2, 'gender': '母'} ]
-
利用列表推导式获取所有狗的品种
[‘银狐’, ‘法斗’, ‘土狗’, ‘哈士奇’, ‘银狐’, ‘土狗’]
breed_list=[x['breed'] for x in dogs] print(breed_list)
-
利用列表推导式获取所有白色狗的名字
[‘贝贝’, ‘可乐’]
names_list=[x['name'] for x in dogs if x['color']=='白色'] print(names_list)
-
给dogs中没有性别的狗添加性别为 ‘公’
for dog in dogs: dog.setdefault('gender','公') print(dogs)
-
统计 ‘银狐’ 的数量
num=len([dog['breed'] for dog in dogs if dog['breed']=='银狐' ]) print(num)
-