回顾
day 5 - 05.06
# 1. 相关函数 max min sum sorted reversed len list
# soreted 从小到大
# 序列 可以转换成列表
# 2相关方法
list
# 3 推导式
# 变换 -> [表达式 for 变量 in 序列]
# 部分变换 -> [三目运算符 for 变量 in 序列]
# 筛选 删除 -> [表达式 for 变量 in序列 if 条件语句]
# 4.元组
# (元素1,元素2,元素3,...)
# 不可变 (不能增删改) ; 有序(支持下标操作)
# 任何类型的数据都可以作为元组元素
t1 = (23,)
t2 = 13,35,6,7,'sd'
t3 = (13,34,46)
x,y,z = t3
x,y,z = 13,34,46
a,*b,c = 12,3,6,56,78,56
总结
1. 什么是字典 dict
'''
字典是容器型数据类型(序列),将{}作为容器标志,里面多个元素用逗号隔开
(每个元素必须是键值对):{键1:值,键2:值,...}
字典是可变的(支持增删改);字典是无序(不支持下标操作)
键:必须是不可变的数据(数字、字符串、元组)(列表、字典可变)
键是唯一的
值:值才是字典真正想要保存的数据,键的做用就像列表的下标,来对值进行区别和说明,
值可以是任何类型的数据
'''
- 空字典
-
空元组没有意义,空列表和空字典是有意义的
-
ict1 = {} print(dict1,type(dict1),len(dict1))
- 字典无序
-
print([1,2,3] ==[3,2,1]) #False print({'a':1,'b':2} == {'b':2,'a':1}) #True
- 键是不可变的
-
print({12:23,'23':33,(1,3):23}) # print({12:23,'23':33,[1,3]:23}) 报错 列表是可变的
4.键是唯一值
-
print({12:23,'23':33,12:34,'23':3}) #{12: 34, '23': 3}
2.字典增删改查
-
查 - 获取值
-
查单个
字典[键] - 获取字典中指定对应的值,键不存在会报错
字典.get(键) -获取字典指定键对应的值,键不存在不会报错返回None
字典.get(键,默认值)-获取字典指定键对应的值,键不存在不会报错返回默认值
dog = {'name':'旺财', 'breed':'土狗','gender':'母狗','age':2} print(dog['name']) #旺财 print(dog.get('breed')) #土狗 print(dog.get('bre')) #None print(dog.get('bre',3)) #3
- 遍历
''' for 变量 in字典: 循环体 zhu注意:变量取到的是字典的键 ''' x = {'a':23} dog = {'name':'旺财', 'breed':'土狗','gender':'母狗','age':2} for x in dog: print(x,dog[x],sep=' ',end=' ') students = [ {'name': '程明明', 'age': 27, 'score': 89, 'tel': '18860901744', 'gender': '男'}, {'name': '梅迁', 'age': 26, 'score': 93, 'tel': '13567193428', 'gender': '男'}, {'name': '张三', 'age': 18, 'score': 43, 'tel': '15367423810', 'gender': '女'}, {'name': '李四', 'age': 34, 'score': 65, 'tel': '13799413758', 'gender': '不明'}, {'name': '王麻子', 'age': 23, 'score': 76, 'tel': '15533753219', 'gender': '男'}, {'name': '李冰冰', 'age': 17, 'score': 99, 'tel': '17742589773', 'gender': '女'} ] # 练习:统计未成年的人数 count = 0 for x in students: if x['age'] < 18: count += 1 print(count) # 练习:通过列表推导式获取字典所有的值 stu = {'name': '程明明', 'age': 27, 'score': 89, 'tel': '18860901744', 'gender': '男'} # ['程明明', 27, 89, '18860901744', '男'] stu1 = [stu[x] for x in stu] print(stu1)
-
-
增 改
字典[键] = 值 – 当键不存在的时候就是添加键值对,当键存在的时候就是修改键对应的值
dog = {'name':'旺财', 'breed':'土狗','gender':'母狗','age':2} print(dog) # 添加 dog['weight'] = 24 print(dog) # 修改 dog['name'] = '财财' print(dog)
-
删
# 1) del 字典[键]-- 删除字典中指定键对应的键值对 (没有会报错 dog = {'name':'旺财', 'breed':'土狗','gender':'母狗','age':2} del dog['breed'] print(dog) #{'name': '旺财', 'gender': '母狗', 'age': 2} # 2)字典.pop(键) - 取出字典指定键对应的值 dog = {'name':'旺财', 'breed':'土狗','gender':'母狗','age':2} del_val =dog.pop('gender') print(dog) #{'name': '旺财', 'breed': '土狗', 'age': 2} print(dog,del_val) #{'name': '旺财', 'breed': '土狗', 'age': 2} 母狗 # 练习:写程序交换字典的键和值 # {'a': 'b', 'c': 'd', 'e': 'f'} -> {'b': 'a', 'd': 'c', 'f': 'e'} s = {'a': 'b', 'c': 'd', 'e': 'f'} b = {} for x in s: b[s[x]] = x print(b) # zid字典推导式:{键:值 for 变量 in 序列} dict2 = {s[x]:x for x in s} print(dict2) # 练习:使用推导式产生一个字典: # {2:4, 3:6, 4:8, 5:10} # {2:22, 3:33, 4:44, 5:55} a = range(2,6) list2 = {x: 2 * x for x in a} print(list2) list3 = {x: 10 * 11 for x in range(2,6)} print(list3) dict
字典相关操作和方法
-
运算符
-
字典不支持比较运算(比较大小) 和数学运算
print([1,34,5,6] > [12,4]) # False ,比较相同位置上的值大小 # print({'a':12}>{'a':34}) TypeError: '>' not supported between instances of 'dict' and 'dict' # print({'a':12}+{'a':34}) TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
-
-
in 和 not in
-
键 in 字典-- 判断字典中是否存在指定键对应的键值对
-
键 not in 字典 -判断字典中是否不存在指定键对应的键值对
cat = {'name':'咖啡','color':'白色'} print('咖啡' in cat) # False print('name' in cat) #True
-
-
相关函数 len dict
print(len(cat)) # 2 # dict(数据) -- 将指定数据转换成字典 # 数据的要求:a.数据本身是一个序列 # b.序列中de元素必须有且只有两个元素的小序列 # c.小序列中的元素必须是不可变的数据 sep = [(1,34),'sd'] result = dict(sep) print(result) #{1: 34, 's': 'd'} result = dict((x,x*2) for x in range(3)) print(result) # 字典转序列 cat = {'name':'咖啡','color':'白色'} print(list(cat)) #['name', 'color']
-
字典相关方法
# 1) 字典.clear() cat.clear() print(cat) # 2)字典.copy() cat = {'name':'咖啡','color':'白色'} # cat2 = cat.copy(cat) # 3)keys , values, items # 字典.key() -获取字典所有的键,返回的值是序列 # 字典.values() - 获取字典所有的zh值,返回的值是序列 # 字典.items()- 将字典转换成元素是元组的序列(一个键值对对应一个元组) cat = {'name':'咖啡','color':'白色'} print(cat.keys()) #dict_keys(['name', 'color']) print(cat.values()) #dict_values(['咖啡', '白色']) print(cat.items()) #dict_items([('name', '咖啡'), ('color', '白色')]) for x,y in cat.items(): print(x,y) # 不建议用 要遍历两次 用for # 4)字典.setdefault(键,值) - 添加键值对 (存添加,键在的时候i不会改原数据) cat = {'name':'咖啡','color':'白色'} cat.setdefault('weight',23) print(cat) #{'name': '咖啡', 'color': '白色', 'weight': 23} cat.setdefault('color','黑色') print(cat) #{'name': '咖啡', 'color': '白色', 'weight': 23} # 5) 字典.uppdate(序列) -- 将序列中的元素添加到字典中(序列必须是可以转换成字典的序列) # 字典1.update(字典2) --将字典2中所有的键值对添加到字典1中 # 没有就会添加 ,有的 就会修改 cat = {'name':'咖啡','color':'白色'} cat.update([(1,2),'as']) print(cat) #{'name': '咖啡', 'color': '白色', 1: 2, 'a': 's'} cat = {'name':'咖啡','color':'白色'} cat.update({'color':'heise'}) print(cat) #{'name': '咖啡', 'color': 'heise'}
集合
-
什么是集合(set)
''' 集合是容器型数据类型(序列),将{} 作为容器标志,里面多个元素用逗号隔开: {元素1 , 元素2,} 集合是可变的(支持增删改):无序的(不支持下标操作) 集合的元素:必须是不可变的数据;唯一的 ''' #1) 空集合 set1 = set() print(set1,type(set1),len(set1)) #set() <class 'set'> 0 # 2) 集合无序 print({1,23,4} == {4,23,1}) #True #3) 集合的元素是不可变的数据 print({12,'24',(1,3)}) # print({12,'24',[1,3]}) # 报错 # 4) 集合元素是唯一的 print({12,34,43,23,23,34,12}) #{34, 43, 12, 23} names = [12,34,43,23,23,34,12] print(set(names)) #{34, 43, 12, 23}
-
集合的增删改查 改(删掉原来的再加进去没办法直接改)
- 没有下标信息 没法查单个
# 1) 查 - 只有遍历 nums = {12,34,43,2,23,4,1} print(list(nums)) for x in nums: print(x,end=' ') # 2) 增 # 集合.add(元素) -- 在集合中添加指定元素 # 集合.update(序列) -- 将序列中所有的元素都添加到集合中 nums.add(100) print(nums) nums.update('asd') print(nums) #{1, 2, 34, 4, 100, 's', 43, 12, 'd', 'a', 23} nums.update({'asd':12,'你':23}) print(nums) # 3) 删 # 集合.remove(元素) - 删除指定元素 元素不存在报错 # 集合.discard(元素) - 删除指定元素 元素不存在不报错 nums = {12,34,43,2,23,4,1} nums.remove(12) print(nums) nums.discard(34) print(nums) nums.remove(100) print(nums) nums.discard(100) print(nums)
数字数据
数学集合运算:& (交集) | (并集) -(差集) ^(对称差集)> \ < (判断是否是真子集) >= \ <= (判断是否是子集)
set1 = {1,2,3,4,5,6}
set2 = {1,6,4,5,8,9}
# 1. 集合1 & 集合2 _ 交集(获取两个集合公告部分)
print(set1 & set2) #{1, 4, 5, 6}
# 2. 集合1 | 集合2 - 并集(将两个集合合并产生一个新的集合)
print(set1 | set2) #{1, 2, 3, 4, 5, 6, 8, 9}
# 3.集合1- 集合2 - 差集(获取集合1中除了包含在集合2中以外的元素)
print(set1 - set2) # {2, 3}
print(set2 - set1) #{8, 9}
# 4.集合1^集合2 - 对称差集(集合1和集合2 合并然后去掉公共部分)
print(set1 ^ set2) #{2, 3, 8, 9}
# 5.子集
# 集合1 > 集合2 -判断集合2是否是集合1 的真子集
print({13,23,34,5} > {1,34}) #False
print({13,23,34,5} > {13,34}) #True 真子集:除了包含元素 还有其它元素
print({12, 34}> {12, 34}) #False
print({12, 34}>= {12, 34}) #True 子集
作业
-
定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )
-
统计不及格学生的个数
-
打印不及格学生的名字和对应的成绩
-
统计未成年学生的个数
-
打印手机尾号是8的学生的名字
-
打印最高分和对应的学生的名字
-
删除性别不明的所有学生
-
将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
students = [ {'姓名':'王大','年龄': 23,'成绩': 67,'电话':15736515673,'性别':'男'}, {'姓名':'李二','年龄': 24,'成绩': 87,'电话':15736515683,'性别':'男'}, {'姓名':'李芳芳','年龄': 25,'成绩': 97,'电话':15736515673,'性别':'女'}, {'姓名':'天天','年龄': 26,'成绩': 87,'电话':15336515678,'性别':'女'}, {'姓名':'王二','年龄': 23,'成绩': 55,'电话':15936515673,'性别':'男'}, {'姓名':'明明','年龄': 26,'成绩': 73,'电话':15735515678,'性别':'不明'} ] # 1. 统计不及格学生的个数 list1 = [ x for x in students if x['成绩'] < 60 ] print(len(list1)) count = 0 for x in students: if x['成绩'] < 60: count += 1 print('不及格个数:',count) # 2. 打印不及格学生的名字和对应的成绩 for x in students: if x['成绩'] < 60: print('姓名:',x['姓名'],'成绩:',x['成绩']) # 3. 统计未成年学生的个数 list1 = [ x for x in students if x['年龄'] < 18 ] print(len(list1)) # 4. 打印手机尾号是8的学生的名字 list1 = [ x['姓名'] for x in students if x['电话'] % 10 == 8 ] print(len(list1)) # 5. 打印最高分和对应的学生的名字 max1 = students[0]['成绩'] for x in students: if x['成绩'] > max1: max1 = x['成绩'] print(max1) stu = [x for x in students if x['成绩'] == max1] print(stu) for st in stu: print(st) print(st['姓名'], st['成绩']) # 6. 删除性别不明的所有学生 list2 = [] [list2.append(x) for x in students if x['性别'] != '不明'] print(list2) # 7. 将列表按学生成绩从大到小排序(挣扎一下,不行就放弃) list2 = [x['成绩'] for x in students] print(list2) list2.sort(reverse=True) print(list2) list3 = [] for y in list2: for x in students: if y == x['成绩']: list3.append(x) print(list3)
-
-
用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)
-
求选课学生总共有多少人
-
求只选了第一个学科的人的数量和对应的名字
-
求只选了一门学科的学生的数量和对应的名字
-
求只选了两门学科的学生的数量和对应的名字
-
求选了三门学生的学生的数量和对应的名字
python = {'stu1', 'stu2', 'stu3', 'stu6', 'stu7', 'stu10', 'stu11'} h5 = {'stu1', 'stu3', 'stu5', 'stu7', 'stu8', 'stu10'} jav = {'stu1', 'stu2', 'stu5', 'stu6', 'stu8', 'stu9', 'stu12'} # 1. 求选课学生总共有多少人 set1 = python | h5 | jav print('总人数',len(set1)) # 2. 求只选了第一个学科的人的数量和对应的名字 set2 = python - (python & h5) - (python & jav) print('只选了第一个学科的人数:',len(set2),set2) # 3. 求只选了一门学科的学生的数量和对应的名字 set3 = python ^ h5 ^ jav print('只选了一门学科的学生人数',len(set3),set3) # 4. 求只选了两门学科的学生的数量和对应的名字 set5 = python & h5 & jav set4 = set1 - set2 -set5 print('只选了二门学科的学生人数',len(set4),set4) # 5. 求选了三门学生的学生的数量和对应的名字 set5 = python & h5 & jav print('选了三门学科的学生人数',len(set5),set5)
-