字典
字典:容器型数据类型 - 方便保存各种不同类型的数据
1.认识字典(dict):
1)将{}作为容器标志,里面多个键值对用逗号隔开,字典中元素只能是键值对
键值对的格式:键:值,
空字典:{}
2)字典的特性:可变性;无序性
3)元素的要求:
键:必须是不可变的唯一的数据(数字、字符串、元组、布尔等)
值:没有要求
字典和列表的选择:
需要同时保存多个数据的时候,如果多个数据的意义相同(无需区分),就使用列表;
如果多个数据的意义不同,就使用字典
2.字典的基本操作:
1.查 - 获取字典的值()
1)查单个(重要) - 获取一个值
语法1:字典[键] - 获取字典中指定键对应的值
语法2:字典.get(键,默认值)
dog={'name':'旺财','age':'3',"breed":'土狗',"color";'白色'}
print(dog['age'])
print(dog['name'])
print(dog['high']) #获取不存在键时,会报错
print(dog.get('breed'))
print(dog.get('color'))
print(dog.get('high')) #获取不存在键时,不报错,返回None
print(dog.get('high',5)) #获取不存在时,不报错,返回默认值5
2)遍历
a,直接遍历
for 变量 in 字典:
pass
stu = {'name':'萨拉及','gender':'男','age':18,'score':100}
for x in stu:
print(x,stu[x])
b.键值遍历
for 键,值 in 字典.items():
pass
3.字典的增删改操作
1.增/改 - 添加/修改键值对
1)字典[键] = 值 如果键存在就修改指定键对应的值;如果键不存在就添加键值对
cat = {'name':'花花','breed':'加菲','color':'白色'}
print(cat)
#加
cat['age']=2
print(cat)
#改
cat['name']='小白'
print(cat)
2)字典.setdefault(键,值) - 添加键值对 如果键存在,就不修改;如果键不存在,就添加键值对
2.删 - 删除键值对
del 字典[键] - 删除指定键对应的键值对
字典.pop(键) - 取出指定键对应的值
cat={'name': '花花','breed': '加菲','color': '白色'}
del cat['breed']
print(cat['name'])
result=cat.pop('color')
print(cat,result)
4.字典相关操作
1)字典只支持:==、!=, 不支持:+、*、>、<、>=、<=
2)in 和 not in - 字典的in和not in 操作判断的是字典中是否存在指定的键
键 in 字典
dict1={'a':10,'b':20,'c':30}
print(10 in dict1) #False
print('a' in dict1) #True
3)相关函数:len、dict
len(字典) - 获取字典中键值对的个数
dict(数据) - 将指定数据转换成字典
对数据的要求:
1.数据本身是一个序列
2.序列中的元素必须都是有且只有两个元素的小序列,并且其中第一个元素是不可变的数据
seq=['ab','cd','ef']
print(dict(seq))
seq=[(10,20),range(2),'he']
print(dict(seq))
4)相关方法
a.字典.clear()
b.字典.copy()
c.返回一个序列
字典.keys() - 返回一个序列,元素是字典中的所有键
字典.value() - 返回一个序列,元素是字典中的所有值
字典.items() - 返回一个序列,元素是键值对组成的元组
d.update
字典.update(序列) - 将序列中的元素全部添加到字典中(序列必须是可以转换成字典的序列)
字典1.update(字典2) - 将字典2中的所有键值对都添加到字典1中
5.字典推导式
{表达式1:表达式2 for 变量 in 序列}
2.23-字典练习
-
定义一个变量保存一个学生的信息,学生信息中包括:姓名、年龄、成绩(单科)、电话、性别
student = {'姓名':'诡' , '年龄':18 , '成绩':99 ,'电话':'1008611' ,'性别':'男'}
-
定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )
students=[ {'姓名':'诡神' , '年龄':18 , '成绩':99 ,'电话':'1008611' ,'性别':'男'}, {'姓名':'时空' , '年龄':36 , '成绩':70 ,'电话':'1000008' ,'性别':'男'}, {'姓名':'时刻' , '年龄':16 , '成绩':90 ,'电话':'1003563' ,'性别':'女'}, {'姓名':'如风' , '年龄':28 , '成绩':80 ,'电话':'1008341' ,'性别':'男'}, {'姓名':'楼主' , '年龄':32 , '成绩':59 ,'电话':'1004638' ,'性别':'不明'}, {'姓名':'哀悼' , '年龄':30 , '成绩':66 ,'电话':'1002121' ,'性别':'男'} ]
-
统计不及格学生的个数
方法1 num=0 for x in students: if x['成绩']<60: num+=1 print(num) 方法2 num=len([x['成绩'] for x in students if x['成绩']<60]) print(num)
-
打印不及格未成年学生的名字和对应的成绩
dict1 = {stu['姓名']:stu['成绩'] for stu in students if stu['成绩']<60 } print(dict1)
-
求所有男生的平均年龄
ages=[stu['年龄'] for stu in students if stu['性别']=='男'] print(sum(ages)//len(ages))
-
打印手机尾号是8的学生的名字
方法1 names=[stu['姓名'] for stu in students if list(stu['电话'])[-1]=='8'] print(names) 方法2 for stu in students: if list(stu['电话'])[-1]=='8': print(stu['姓名'])
-
打印最高分和对应的学生的名字
max=students[0]['成绩'] MAX=[{students[0]['成绩']:students[0]['姓名']}] for stu in students[1:]: if stu['成绩']>max: max=stu['成绩'] MAX.clear() MAX.append({stu['成绩']:stu['姓名']}) elif stu['成绩']==max: MAX.append({stu['成绩']:stu['姓名']}) print(MAX)
-
删除性别不明的所有学生
students2=students.copy() x=0 for i,stu in enumerate(students): if stu['性别']=='不明': del students2[i-x] x+=1 print(students2)
-
将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
max=0 new=[] num=0 for i in range(len(students)): for num1,stu in enumerate(students): if stu['成绩']>=max: max=stu['成绩'] num=num1 if num1==len(students)-1: new.append(students[num]) students.remove(students[num]) max=0 print(new)
-
-
定义一个变量保存一个班级的信息,班级信息中包括:班级名称、教室位置、班主任信息、讲师信息、班级所有的学生(根据实际情况确定数据类型和具体信息)
class1 = { 'name': '1班', 'address': '311教室', 'lecturer': { 'name': 'A', 'gender': '男', 'age': 20, 'tel': '1008611' }, 'class_teacher': { 'name': 'S', 'gender': '女', 'tel': '1000000', 'age': 30, }, 'students': [ {'name': 'a', 'gender': '男', 'age': 11, 'score': 92, 'linkman': {'name': '老吴', 'tel': '110'}}, {'name': 'b', 'gender': '女', 'age': 12, 'score': 90, 'linkman': {'name': '老张', 'tel': '120'}}, {'name': 'c', 'gender': '男', 'age': 12, 'score': 87, 'linkman': {'name': '老赵', 'tel': '130'}}, {'name': 'd', 'gender': '女', 'age': 13, 'score': 80, 'linkman': {'name': '老刘', 'tel': '140'}}, {'name': 'e', 'gender': '男', 'age': 11, 'score': 95, 'linkman': {'name': '老徐', 'tel': '150'}}, {'name': 'f', 'gender': '女', 'age': 11, 'score': 94, 'linkman': {'name': '老胡', 'tel': '160'}}, {'name': 'g', 'gender': '男', 'age': 12, 'score': 85, 'linkman': {'name': '老王', 'tel': '170'}} ] }
-
已知一个列表保存了多个狗对应的字典:
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': '母'} ]
-
利用列表推导式获取所有狗的品种
[‘银狐’, ‘法斗’, ‘土狗’, ‘哈士奇’, ‘银狐’, ‘土狗’]
breeds=[d['breed'] for d in dogs] print(breeds)
-
利用列表推导式获取所有白色狗的名字
[‘贝贝’, ‘可乐’]
names=[d['name'] for d in dogs if d['color']=='白色'] print(names)
-
给dogs中没有性别的狗添加性别为 ‘公’
for d in dogs: d.setdefault('gender','公') print(dogs)
-
统计 ‘银狐’ 的数量
num=0 for d in dogs: if d['breed']=='银狐': num+=1 print(num)
-