day09 元组和字典
一、作业修改
1、07(2)作业
4、已知一个数字列表,写程序判断这个列表时候是连续递增列表。
list1 = [1, 2, 3,7, 5]
if list1==sorted(list1):
print('list1是连续递增')
else:
print('list1不是连续递增')
- 从第二个元素开始往后取,分别与前面元素比较
for i in range(1,len(list1)):
if list1[i]>list1[i-1]:
print('list1不是连续递增')
break
else:
print('list1是连续递增')
5、已知两个列表,将两个列表按照下面的规律交叉合并
- 方法 1 insert操作超过下标时,插入到最后
A = [10, 20, 30, 40, 50]
B = [100, 200, 300]
count1,count2=len(A),len(B)
for i in range(count2):
A.insert(2*i+1,B[i])
print(A)
- 方法2 pop()
C=[]
while True:
C.append(A.pop(0))
C.append(A.pop(0))
if A==[]or B==[]:
break;
C+=A+B
print(C)
2、08作业
1.获取手机号最后一位
for i in stu:
if i.get('tel')[-1]=='8':
print(i.get('name'))
2、最高分考虑多个人最高分,先找最高分。再找分为最高分的学生
max1=stu[0]['scores']
j=0
print(max1)
for i in stu[1:]:
score=i['scores']
if score>max1:
max1=score
result=[print(i['name'],i['scores'])for i in stu if i['scores']==max1]
方法1.键第一个学生设为最高分,(最高分不止一个),
当前分数小于最高分,更新最高分,清除name列表,添加最该分对应的学生姓名、
当前分数等于最高分,添加学生姓名到name列表
name=[stu[0]['name']]
max1=stu[0]['scores']
for i in stu:
score=i['scores']
if score>max1:
max1=score
name.clear()
name.append(i['name'])
elif score==max1:
name.append(i['name'])
print(max1,name)
3、将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
stu.sort(reverse=True,key=lambda stu:stu['scores'])
print(stu)
二、字典相关操作
1、相关操作
-
字典不支持加、乘、比较、运算
-
字典的in 和 not in
判断字典中是否存在指定的键,不是判断值
dict1={'a':10,'b':19,'c':22}
print(10 in dict1) #False
print( 'a' in dict1) #True
2、相关函数
-
注意:
- 对字典sum操作是求键的和
- max,min 是求最小键
-
len(字典) - 获取字典长度
print(len(dict1))
- dict(数据) - 其他数据转换从字典
- 对转换的数据要求:
- 数据必须是序列
- 序列中元素必须是有且仅有两个元素的小序列(字典元素由键和值组成)
- 对转换的数据要求:
data=[[10,19],[13,24],[90,100]]
print(dict(data)) # {10: 19, 13: 24, 90: 100}
data2=['ab','cd','ef']
print(dict(data2)) # {'a': 'b', 'c': 'd', 'e': 'f'}
data3=[[10,20],'ab',range(2)]
print(dict(data3)) # {10: 20, 'a': 'b', 0: 1}
- 元组转换成字典:
data4=[('name','小明'),('age',18)]
-
list(字典) - 将字典转换成列表
将字典中所有的键作为列表的元素
dog = {'name': 'lily', 'age': 3, 'color': 'black', 'breed': '土狗'}
list(dog)
print(list(dog)) # ['name', 'age', 'color', 'breed']
3、字典相关方法 - 字典.xxx()
-
字典.clear() - 清空字典
-
字典.copy() - 复制一个字典返回一个新字典
-
查值:
- 字典.keys() - 获取所有的键
- 字典.values() - 获取所有的值
- 字典.items() - 将字典转换成一个序列,序列中每个元素是每个键值对对应的元组
print(dict1.keys())
print(dict1.values())
print(dict1.items())
-
字典1.update(字典2) - 将字典2中所有键值对添加在字典1中
出现相同的键,键对应的值更新
dict1={'a':10,'b':19,'c':22}
dict1.update({100:10,'a':22})
print(dict1) # {'a': 22, 'b': 19, 'c': 22, 100: 10}
三、元组
1、什么是元组
-
元组是序列容器型数据类型
- 将()作为容器标志,里面多个元素用逗号隔开
- (数据1,数据2,…)
-
元组不可变(不支持增删改)
- 元素个数、值都不能变
-
元组是有序的
- 顺序影响结果,支持下标操作
-
元素要求
- 任何数据类型的数据都可以作为元组的元素
1)、空元组
t = ()
print(t)
2)、只有一个元素的元组,必须在唯一的元素后加逗号
t1 = (100) # 括起来表示一个整体,
print(type(t1)) # <class 'int'>
t2 = (100,)
print(type(t2)) # <class 'tuple'>
3)、正常的元组
t3 = (1, 'a', True)
4)在没有歧义的情况下元组的()可以省略 - 直接将多个数据用逗号隔开,也是一个元组
t4 = 10, 12, 33, 78
print(t4) # (10, 12, 33, 78)
5)函数返回元组
# return 100,2000
2、元组的使用
-
使用元组的实际情况:
- 一般不会主动使用元组保存多个数据,
- 但是遇到元组时必须会使用元组
-
组是不可变的列表
- 列表相关操作应用中,除了可变相关内容,其他元组都支持,
-
获取元素,列表咋样获取,元组就咋样
t5 = ('狂飙', '黑暗荣耀', '回家的诱惑', '三国演义', '琅琊榜', '甄嬛传')
print(t5[0], t5[4]) # 获取单个元素
切片
print(t5[1:-1])
print(t5[0::2])
遍历
for i in range(len(t5)):
print(i, t5[i])
for i in t5:
print(i)
for index, valu in enumerate(t5):
print(index, valu)
-
加法、乘法、比较、in 和not in - 和列表一样
-
相关函数
- sum,max,min,sorted,len,
- tuple() - 将序列中的元素转换成元组的元素,规则与列表一样
-
相关方法:
- 元组.count(元素) - 统计元素个数
- 元组.index(元素) - 获取元素下标值
-
补充:
- 让变量的个数与元组或者列表中的元素保持一致,来依次获取列表或元组中的元素(数据较少时使用)
list1 = [100, 200, 300]
x, y, z = list1
print(x, y, z)
t1 = (10, 20, 30)
i, j, k = t1
print(i, j, k)
- 应用
1)x包含下标和元组的元素
for x in enumerate(list1):
print(x)
# (0, 100)
# (1, 200)
# (2, 300)python
2)enumerate两个变量分别获取下标和元素
for index ,item in enumerate(list1):
print(index ,item)
# 0 100
# 1 200
# 2 300
3)变量的个数与元组或者列表中的元素保持一致
list1=[('小明',18,'男'),('小花',18,'女'),('小华',20,'男')]
for name,age,gender in list1:
print(name,age,gender)
# 小明 18 男
# 小花 18 女
# 小华 20 男
四、集合
1、什么是集合(和数学一回事)
-
集合是容器型数据类型;
- 将{}作为容器的标志,里面多个数据用逗号隔开
- {数据1,数据2,数据3…}
-
集合是可变的(支持增删改)
-
集合是无序的(不支持下标操作,顺序不影响结果)
-
对元素的要求:
- 不可变数据类型(和字典对键的要求一样)
- 元素是唯一的
1)、空集合
s1 = set()
print(s1, type(s1), len(s1))
2)、无序性
print({10, 20, 40, } == {10, 40, 20}) # True
3)、集合的元素必须是不可变类型的数据
s2 = {'abc', 10, True, (10, 20)}
# s2={'abc',10,True,[10,20]} # TypeError: unhashable type: 'list'
4)集合元素的唯一性(自带去重功能 - 所有序列可转换成集合)
s3 = {10, 20, 40, 10, 20}
print(s3) # {40, 10, 20}
2、数学集合运算(交、并、差集、对称差集、子集、真子集)
-
交集 - 两个集合的公共部分
集合1 & 集合2
s1 = {1, 2, 3, 4, 5, 6, 7, 8}
s2 = {5, 6, 7, 8, 9, 10, 11} #{8, 5, 6, 7}
print(s1 & s2)
-
并集 - 两个集合合并成一个集合
集合1 | 集合2
print(s1|s2) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
-
差集 - 集合1 -集合2,求的是集合1去掉公共部分的剩下的部分
集合1 -集合2
print(s1-s2) # {1, 2, 3, 4}
print(s2-s1) # {9, 10, 11}
-
对此差集 - 结果是取掉集合1和集合2取掉公共部分剩下的部分
集合1 ^集合2
print(s1^s2) # {1, 2, 3, 4, 9, 10, 11}
-
子集
{1,2,3,}的子集{}、{1}、{2}、{3}、{1,2}、{1,3}、{3,2},{1,2,3}
集合1 >= 集合2 - 判断集合2是否是集合1的子集
集合1 <=集合2 - 判断集合1是否是集合2的子集
print({1}<={1,2,3}) # True
-
真子集
{1,2,3,}的真子集{}、{1}、{2}、{3}、{1,2}、{1,3}、{3,2}
集合1 > 集合2 - 判断集合2是否是集合1的真子集
集合1 <集合2 - 判断集合1是否是集合2的真子集
print({1}<{1,2,3}) # True
print({1,3,5}>{1,2,3}) # False
五、字符串
1、什么是字符串
-
字符串是容器型数据类型(同时保存多个文字符号);
- 将单引号、双引号或者三个单引号或者三个单引号作为容器的标志
- 里面的每一个符号都是字符串的元素
- 单引号双引号里面的字符串不能换行,但是三个双引号或者三个双引号可以换行
-
字符串不可变;字符串有序
-
字符串的元素:
- 字符串引号中每一个独立的符号都是字符串的元素,字符串的元素又叫字符;
- 任何文字符号都可以是字符串的元素(中文符号、英文符号、韩日语、表情符号……)**单引
msg = 'aaa\nbbb'
print(msg)
def fun():
"""说明文档"""
class A:
""" 说明文档"""
str1 = 'abc'
print(str1.upper()) # 是创建了一个新的字符串,不是修改
str2 = 'mk,1,五,哈哈😊🤩🤔🥰'
print(str2)
1)空串 - 引号中啥也没有(引号中有空格是不是空串)
str3 = ' '
print(len(str3))
2、字符 - 字符串中每一个独立的符号
- 普通字符 - 在字符串中表示符号本身的字符就是普通字符
- 转义字符 - 在字符串中有特殊意义或者特殊功能的符号就是转义字符(在特定的符号前加 \ 来表示特殊意义或者功能)
3、转义字符
\n - 换行
\t - 水平制表符(摁一次tab键)
\\ - 表示普通的反斜杠
\' - 表示普通的单引号
\" - 表示普通的双引号
str3='it\'s ok!'
print(str3)
str4="it's ok!"
print(str4)
str5='i say:"good good study!"'
print(str5)
str6="i say:\"good good study!\""
print(str6)
-
r字符串
在字符串引号前面加r或者R,可以让所有转义字符功能失效(让所有字符都变成普通字符)
str6='\nac\t'
print(str6)
str6=r'\nac\t'
print(str6)