day6-元祖和字典
元祖
-
什么是元祖(tuple)
元祖是
不可变
的列表元祖是容器型数据类型,将()作为容器标志,里面多个元素用逗号隔开:(元素1,元素2…)
元祖
不可变
(不支持元素的增删改);元祖是有序
的(支持下标的操作)元素:
任何数据类型
,并且可以重复t1 = (1,3,'abc',85) print(type(t1), t1) # <class 'tuple'> (1,3,'abc',85)
-
只有一个元素的元祖
如果元祖中有且只有一个元素,那么唯一的元素的后面必须加逗号
t2 = (12,) print(type(t2)) # <class 'tuple'>
-
省略括号
在没有歧义的情况下,可以省略元祖的(),直接将多个元素用逗号隔开来表示一个元祖
t5 = 'abc',42,58,True print(t5,type(t5)) # # ('abc', 42, 58, True) <class 'tuple'>
-
获取元素
1)列表获取元素的方法元祖都支持
song = ('葫芦娃', '稻香', '夜曲', '下山') print(song[1]) print(song[1:]) for x in song: print(x) for index,x in enumerate(song): print(index,x) for index in range(len(song)): print(song[index])
2)让变量的个数和元祖中元素的个数保持一致 来获取元祖所有元素的值
变量1,变量2,变量3… = 元祖
num1,num2,num3 = (12,25,6) x,y,z = 2,25,6
3)同时用多个变量获取元祖中的元素的时候,变量的个数可以比元祖中的个数少,但是有且只有一个变量的前面加*
*m,n = 25,12,6 print(*m,n) # 25,12,6 stu = ('小明','男',20,52,170) m1,*m2,m3 = stu print(m1,*m2,m3) # 小明 ['男', 20, 52, 58, 6] 8
-
元祖的相关操作
列表相关操作元祖都支持
print((1,2,3) + (4,5)) # (1,2,3,4,5) print((1,2,3)*2) # # (1, 2, 3, 1, 2, 3) print((1,2,3) > (44,2)) # False print((1,2,3) == (1,3,2)) # False (元祖是有序的)
in 和 not in
print(10 in (10,20,30)) # True print(10 not in (10,20,30)) # False
sum,max,min, sorted,len,tuple
t1 = (1,2,3) print(sum(t1)) print(max(t1)) print(min(t1)) new_t1 = sorted(t1) # 排序(升序) 产生一个新的列表 print(new_t1) # [1, 2, 3] print(len(t1)) # 3 print(tuple('abc')) # ('a', 'b', 'c') print(tuple(range(5))) # (0, 1, 2, 3, 4)
字典
-
什么时候使用字典:
同时保存多个意义不同的数据就使用字典
-
什么是字典
字典是容器型数据类型,将{}作为容器,里面多个元素用逗号隔开(元素必须键值对:{键1:值1,…})
字典是可变的(支持增删改查),字典是无序的(不支持下标操作)
元素: 必须是键值对:
键: – 必须是不可变的数据(数字,字符串,元祖)一般使用字符串,键是用来对值进行描述和区分的,是唯一的
值: – 没有要求
1)键是不可变的
d2 = {'name':'小明',10:200,(1,2):200} print(d2) # {'name': '小明', 10: 100, (1, 2): 200} # 报错! 列表不能作为键 d2 = {'name':'小明',10:200,[1,2]:200} print(d2) # # TypeError: unhashable type: 'list'
2)键是唯一的
d3 = {'name':'小明','age':'18','name':'张三'} print(d3) # {'name': '张三', 'age': '18'}
3)字典是无序
print({'a':10,'b':20} == {'b':20,'a':10}) # True
-
字典的增删改查
1.1)获取单个值
a.字典[key] - 获取指定key对应的值(如果key
不存在会报错
)b.字典.get(key) - 获取指定key对应的值(如果key不存在
不
会报错)dog = {'name':'财财','age':2,'sex':'母狗'} print(dog['name']) # 财财 print(dog.get('age')) # 2 print(dog.get('weight')) # None print(dog.get('weight',0)) # 0
1.2)遍历
for 变量 in 字典:
pass
注意:变量依次取到的是字典的key
dog = {'name':'财财','age':2,'sex':'母狗'} for x in dog: print('x:',x,dog[x]) # x: name 财财 # x: age 2 # x: sex 母狗
2) 增、改
字典[key] = 值 – 当key存在就是修改指定的值,当key不存在就是添加键值对
dog = {'name':'财财','age':2,'sex':'母狗'} dog['name'] = '花花' dog['weight'] = 20 print(dog) # {'name': '花花', 'age': 2, 'sex': '母狗', 'weight': 20}
3)删
del 字典[key] - 删除指定key对应的键值对
字典.pop(key) - 取出指定key对应的值
dog = {'name':'财财','age':2,'sex':'母狗'} del dog['name'] print(dog) # {'age': 2, 'sex': '母狗'} del_age = dog.pop('age') print(dog,del_age) # {'sex': '母狗'} 2
字典的实际应用
练习:定义一个变量保存一个班级的信息,班级信息主要包含:班级名称、位置、容量、班主任、讲师、所有学生 班主任:姓名、性别、年龄、电话、QQ 讲师:姓名、性别、年龄、电话、QQ、级别 所有学生:多个学生,每个学生包含:姓名、性别、年龄、学历、专业、电话
class1 = {
'name':'python2004',
'location':'9教室',
'capacity':'50',
'class_teacher':{
'name':'张老师',
'gender':'女',
'age':'30',
'tel':'110',
},
'teacher':{
'name','骆昊',
'gender','男',
'age','25',
'tel','1558945',
'rank','特级讲师',
},
'students':[
{'name': '小明', 'gender': '男', 'age': 19},
{'name': '小花', 'gender': '女', 'age': 18},
{'name': '张三', 'gender': '男', 'age': 23},
{'name': 'Tom', 'gender': '男', 'age': 22},
{'name': 'Bob', 'gender': '男', 'age': 30}
],
}
print(class1['teacher']['name'],class1['teacher']['rank'])
# 计算班级所有学生平均年龄
sum1 = 0
ages = class1['studens']
for x in ages:
sum1 += x['age']
print(sum1/len(ages)) # 22.4
字典的相关操作
字典不支持加法乘法运算,也不支持比较大小
1)in 和 not in
key in 字典 - 判断字典中是否存在指定的键
d1 = {'a':10,'b':20}
print(10 in d1) # False
print('a' in d1) # True
2)相关函数:len dict
print(len(d1)) # 2
"""
字典的类型转换
dict(数据) - 将指定数据转换成字典,数据要求
a.数据本身是序列
b.序列中的每个元素必须是长度为2的小序列
c.小序列中的第一个元素是不可变的数据
list(数据) - 将指定的字典转换成列表(将字典的key作为列表的元素)
"""
print(dict(['ab',[1,2]])) # {'a':'b',1:2}
# list(字典)
d1 = {'a':10,'b':20,'c':30}
print(list(d1)) # ['a', 'b', 'c']
3)相关方法
1)字典.clear() - 清空字典
2)字典.copy() - 复制字典产生一个一模一样的新字典并返回
3)dict.fromkeys(序列) - 创建一个新的字典,键是序列中的每个元素,值都是None
4)keys values items
"""
字典.keys() - 获取字典所有的key(返回值是序列但是不是列表)
字典.values() - 获取字典所有的值(返回值是序列但是不是列表
字典.items() - 同时获取每个键值对的键和值(返回值是序列,序列中元素是元祖)
"""
d1 = {'a':10,'b':20,'c':30}
print(d1.keys()) # dict_keys(['a', 'b', 'c'])
print(d1.values()) # dict_values([10, 20, 30])
print(d1.items()) # dict_items([('a', 10), ('b', 20), ('c', 30)])
5)字典.setdefault(键,值) - 在字典中添加键值对(只添加不修改)
d1 = {'a':10,'b':20,'c':30}
d1.setdefault('name','小明')
print(d1) # # {'a': 10, 'b': 20, 'c': 30, 'name': '小明'}
6)字典1.update(字典2) - 将字典2中所有的键值对都添加到字典1中:注意:字典2不一定是字典,也可以是能转换成字典的序列
d1 = {'a':10,'b':20,'c':30}
d1.update({'name':'张三'})
print(d1) # # {'a': 10, 'b': 20, 'c': 30, 'name': '张三'}
1.声明一个字典保存一个学生的信息,学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明)
stu = {
'name':'小明',
'age':18,
'score':90,
'tel':1589546,
'sex':'男'
}
2.声明一个列表,在列表中保存6个学生的信息(6个题1中的字典)
a.统计不及格学生的个数
b.打印不及格学生的名字和对应的成绩
c.统计未成年学生的个数
list1 = [
{ 'name':'小明','age':18, 'score':70,'tel':1589546,'sex':'不明'},
{ 'name':'张三','age':15, 'score':90,'tel':1589548,'sex':'男'},
{ 'name':'李四','age':20, 'score':45,'tel':1589546,'sex':'不明'},
{ 'name':'王五','age':16, 'score':56,'tel':1589548,'sex':'男'},
{ 'name':'小王','age':23, 'score':52,'tel':1589542,'sex':'女'},
{ 'name':'小李','age':25, 'score':60,'tel':1589544,'sex':'女'}
]
count = 0
not_adult = 0
for x in list1:
if x['score'] < 60:
print(x['name'],x['score'])
count += 1
if x['age'] < 18:
not_adult += 1
print('不及格的学生有:{}个,未成年的学生有:{}个'.format(count,not_adult)) # 不及格的学生有3个
d.打印手机尾号是8的学生的名字
for i in list1:
if i['tel'] % 10 == 8:
print(i['name'])
e.打印最高分和对应的学生的名字
max_score = 0
max_score_name = ''
# 方法一:
for i in list1:
if i['score'] > max_score:
max_score = i['score']
print(max_score)
for x in list1:
if x['score'] == max_score:
print(x['name'])
# 方法二:
for x in list1:
for i in list1:
if i['score'] > max_score:
max_score = i['score']
if x['score'] == max_score:
# print(x['name'])
max_score_name = x['name']
print(max_score,max_score_name)
f.将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
g.删除性别不明的所有学生
for index,x in enumerate(list1):
if x['sex'] == '不明':
list1.remove(list1[index])
print(list1)
3.用三个列表表示三门学科的选课学生姓名(一个学生可以同时选多门课)
a. 求选课学生总共有多少人
b. 求只选了第一个学科的人的数量和对应的名字
c. 求只选了一门学科的学生的数量和对应的名字
d. 求只选了两门学科的学生的数量和对应的名字
e. 求选了三门学生的学生的数量和对应的名字