Python基础 -- 数据容器

📅 2026/7/24 19:46:09
Python基础 -- 数据容器
ps主包是Java转python所以主包的文章重点在于python和Java在语法上的区别数据容器可以一次容纳多个数据的容器每个元素可以是任意类型本篇从列表list、字符串str、元组tuple、集合set、字典dict一、列表list1、定义列表名称 [元素1元素2元素3.....]下标可以正着从0开始也可以倒着从-1开始索引一旦是负数就意味着是倒着数的可以重复可以不同类型元素有序可以修改#列表的类型 s [1,2,3,4,True,wang] print(type(s)) #输出:list print(s) #输出[1,2,3,4,True,wang] #列表的元素访问(超出范围将会报错) print(s[0]) #正向索引,输出s的第一个元素:1 print(s[-2]) #反向索引,输出s的倒数第二个元素:True #修改列表中的元素(超出范围将会报错) s[2] Li print(s[2]) #修改后第3个元素的值为Li #删除元素(超出范围将会报错) del s[2] print(s) #删除第3个元素后列表为[1,2,4,True,wang] #顺序取出元素 for x in s: print(x,end)#输出124Turewang2、切片对操作的数据截取一部分的数据。序列数据 [ 开始索引结束索引步长 ]不包含结束索引的数据开始索引不指定默认为0结束索引不指定默认为列表长度步长不指定默认为1入伙开始索引为负数步长必须为负数意为从后截取s [1,2,3,4,True,wang] s s[0:3:1] #截取原本s索引从0到2步长为1的数据 print(s) #输出[1,2,3] s [1,2,3,4,True,wang] print(s[0:5:2]) #截取索引从0到4步长为2 输出[1,3,True] print(s[:5:2]) #省略了开始索引开始索引默认从0开始3、列表的方法方法解释样例append()在列表尾部增加元素s.append(4)insert()在指定索引之前插入元素s.insert(0,9)remove()移除列表中第一个匹配到的值的元素s.remove(7)pop()删除列表中指定索引的元素未指定索引默认删除最后一个s.pop(2)/s.pop()sort()对列表进行排序前提是数据类型一样 默认从小到大s.sort()reverse()反转列表元素s.reverse()s [12,2,3,4,5,6,78,2] #在列表尾部追加元素 s.append(8) print(s) #[12,2,3,4,5,6,78,2,8] #在指定索引位置的前面增加元素 s.insert(3,8) print(s) #[12,2,3,8,4,5,6,78,2,8] #删除第一个匹配到的值的元素 s.remove(2) print(s) #[12,3,8,4,5,6,78,2,8] #删除指定索引位置的元素 s.pop(5) print(s) #[12,3,8,4,5,78,2,8] #排序 s.sort() print(s) #[2,3,4,5,8,8,12,78] #反转 s.reverse() print(s) #[78,12,8,8,5,4,3,2]4、列表案例案例1让用户输入10个数字存储到一个列表中输出它们的最大值最小值和平均值引入min获取最小值、max获取最大值、len获取长度、sum求和s [] for i in range(0,10): num int(input(f请输入第{i}个数字)) s.append(num) print(f你输入的列表是[{s}]) s.sort() print(s) print(f排序后的列表是[{s}]) print(f10个数字的最小值是{min(s)}) print(f10个数字的最大值是{max(s)}) print(f10个数字的平均值是{sum(s)/len(s)})案例2合并2个列表中的元素 num_list1 [2,3,7,8,4,5]num_list2 [8,9,10,2,5,7]并进行去重处理除去两个列表中相同的元素引入:in判断元素是否在数列中如果存在返回True进行循环如果不存在返回False;not in反之返回结果为bool解包列表容器拆开为一个一个元素写法“*列表名”组包将多个值组合到一个容器num_list1 [2,3,7,8,4,5] num_list2 [8,9,10,2,5,7] #合并列表 num_list3 [*num_list1,*num_list2] #另一种合并方法直接相加 num_list4 num_list1 num_list2 print(num_list3) #[8, 9, 10, 2, 5, 7, 2, 3, 7, 8, 4, 5] print(num_list4) #去重 new_list [] #去重后的列表 for num in num_list2: if num not in new_list: new_list.append(num) print(new_list) #[8, 9, 10, 2, 5, 7, 3, 4]案例3在列表中输入1~20的平方从下面列表中找出偶数并计算它们的平方组成新的列表引入列表推导式可以把for if可选和要插入的值结合起来[要插入的值 for 变量 in 迭代对象 if 条件]2层for[要插入的值 for 变量 in 迭代对象 for 变量 in 迭代对象]#求出1~20的平方并存放到新容器中 a [i**2 for i in range(1,21)] print(a) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400] #从下面列表中找出偶数并计算它们的平方组成新的列表 b [1,2,3,4,5,6] c [num**2 for num in b if num %2 0] print(c) #[4, 16, 36]二、字符串str1、介绍可以存放任意字符“Python” Python Python,无法修改有序可迭代索引的表示和列表一样正向索引从0开始反向索引从-1开始。字符串名 / /切片语法和列表的切片一样序列对象[开始索引结束索引步长]基本除了不能修改其他都和列表一样直接看实际例子不过多解释#表示 s Python print(s[-1]) #n print(s[3]) #h #字符串不能修改修改会报错 #egs[2] x就会报错 #迭代 for i in range(len(s)): print(s[i],end) #或者 for i in s: print(i,end) #切片 print(s[0:4:2]) #输出Pt print(s[-1:-4:-2]) #输出nh2、字符串的常用方法方法作用实例find()在字符串中查找字符串返回第一次出现的索引位置找不到返回-1s.find(Python)count()统计字串在字符串中出现的次数s.count(H)upper()将字符串中所有字母转化成大写s.upper()lower()将字符串中所有字母转化成小写s.lower()split()将字符串按指定分隔符分割成列表s.split( )strip()去除字符串两端的空白字符(默认)或指定字符s.strip()/s.strip(*)replace()将字符串中的指定字串替换成新的字串s.replace(HC)startswitch()检查字符串是否以指定字串开头返回bools.startswitch(P)s *Hello -- Python -- How are you doing?* print(s.find(Python)) #10 print(s.count(H)) #2 print(s.upper()) #*HELLO -- PYTHON -- HOW ARE YOU DOING?* print(s.lower()) #*HELLO -- PYTHON -- HOW ARE YOU DOING?* #按照‘--’切割成列表 slist s.split(--) print(slist) #[*Hello , Python , How are you doing?*] #去除字符串两端的* s1 s.strip(*) print(s1) #[*Hello , Python , How are you doing?*] print(s.replace(Python, Java)) #*Hello -- Java -- How are you doing?* print(s.startswith(*Hello)) #True3、案例邮箱验证用户输入一个邮箱验证邮箱格式是否正确至少包含一个 . 和只有一个若格式正确则输出邮箱格式正确若错误则输出邮箱格式错误user input(Enter your username: ) if . in user and user.count() 1: print(邮箱格式正确) else: print(格式输入错误)三、元组tuple1、介绍元组和列表相似可以存储不同类型有序可重复支持索引访问切片但是不可以修改(增删改)定义元组名称 元素1元素2.......或元素名称 元素1元素2 ......空元组 元素名称 或 元素名称 tupletuple是个函数后面详细说明如果定义单元组元组名称 元素1直接元素名称 元素会被识别为元素类型而不是元组2、方法只有2个方法介绍实例count统计某元素在元组中出现的次数s.count(2)index查找某个元素第一次出现在索引中的位置s.index(True)#定义 t (2,3,5,56,6,True,H,P,H) print(t[0],t[-1]) #2 H #如果 t[1] 9则报错因为元组不支持修改 #切片 print(t[2:7:2]) #(5,6,H) #count() print(t.count(H)) #2 #index() print(t.index(H)) #6 #单元素元组 t1 (200,) print(type(t1)) #class tuple t2 (200) print(type(t2)) #class tuple3、组包和解包组包将多个值合并到一个容器元组、列表解包将容器元组、列表解开成独立的元素分别赋值给多个变量元组解包时*表示收集剩余的所有元素允许我们处理不确定数量的元素生成列表以便于可以进一步的处理#定义元组组包 t (2,3,True,H) #定义元组组包 t1 2,3,True,H #基础解包变量数量与容器的元素个数一致 a,b,c,d t #(*)扩展解包 x,*y,z t #x为2y为[3,True]z为‘H’ s,*o t #s为2o为[3,True,H] *f,e t #f为2,3,Truee为H #案例交换a 20,b 20 a 10 b 20 print(a , b) # 10 20 a,b b,a # 此处相当于做了一个组包和解包的操作 # 组包 # t b,a # 解包 # a,b t #合并后的效果a,b b,a print(a,b) # 20 104、案例案例1根据提供的学生成绩单完成如下需求1计算每个学生的总分、各科平均分然后一并输出2统计各科成绩单额最低分、最高分、平均分并输出3查找成绩优秀平均分大于90 的学生并输出学号姓名语文数学英语A01王五809989A02张三9280100A03李四7810079A04嘉豪967288A05嘉欣899194A06子涵897091A07十三797784A08张冠889289A09李戴868598A10黑子906678#元组内嵌小元组 students ( (王五,80,99,89), (张三,92,80,100), (李四,78,100,79), (嘉豪,96,72,88), (嘉欣,89,91,94), (子涵,89,70,91), (十三,79,77,84), (张冠,88,92,89), (李戴,86,85,98), (黑子,90,66,78) ) #第一种方法 #计算每个学生的总分、各科平均分并输出 Youxiu [] for s in students: total_students s[1]s[2]s[3] avg total_students/3 print(f{s[0]}同学的总分是{total_students} 平均分是{avg:.1f}) #.1f是保留一位小数 if avg 90: Youxiu.append(s[0]) print(f成绩优秀的学生有{Youxiu}) #各科成绩单最低分最高分平均分并输出 Yuwen [s[1] for s in students] Shuxue [s[2] for s in students] YinYu [s[3] for s in students] print(f语文的最高分是:{max(Yuwen)} 语文的最低分是:{min(Yuwen)} 平均分是:{sum(Yuwen)/len(Yuwen):.2f}) print(f数学的最高分是:{max(Shuxue)} 数学的最低分是:{min(Shuxue)} 平均分是:{sum(Shuxue)/len(Shuxue):.2f}) print(f英语的最高分是:{max(YinYu)} 英语的最低分是:{min(YinYu)} 平均分是:{sum(YinYu)/len(YinYu):.2f}) #第二种方法组包解包 for name,Yu_Wen,Shu_Xue,Yin_YU in students: total_students Yu_Wen Shu_Xue Yin_YU avg total_students/3 print(f{name}同学的总分是{total_students} 平均分是{avg:.1f}) #.1f是保留一位小数 if avg 90: Youxiu.append(name) print(f优秀的同学有{Youxiu})四、集合set1、介绍集合是一种无序不重复可以自动去重可修改的数据容器定义集合名称 {元素1元素2......}集合名称 set空集合ps空集合不能用{}定义{}定义出来的是字典且集合是无序的所以不支持索引检索2、方法方法含义实例add(...)添加元素到集合中s.add(t)remove(...)移除集合中的指定元素若不存在将报错s.remove(t)pop()随机删除集合中的一个元素并返回e s.pop()clear()清空集合s.clear()difference()求取两个集合的差集包含第一个集合但不包含在第二个集合的元素s.difference(s1)union()或“|”求取两个集合的并集s.union(s1)intersection()或“”求取两个集合的交集s.intersection(s1)#定义 s1 {0,1,2,3,4,5,6,7,8,9,0} s2 {11,t,0,9,5} print(s1) #输出{0,1,2,3,4,5,6,7,8,9}自动去重了一个0 s1.add(10) print(s1) #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} s1.remove(10) print(s1) #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} print(s1.pop()) #0 print(s1.difference(s2)) #{1, 2, 3, 4, 6, 7, 8} print(s1.union(s2)) #{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, t} print(s1.intersection(s2)) #{9, 5} s1.clear() print(s1) #空集set()3、案例根据提供的学生课程情况完成以下要求1同时选修了法语和艺术的学生2同时选修了所有四门课的学生3选修了足球但是没有选修篮球的学生4输出每个学生所选修课程的数量football_set {王五,李四,张冠,李代,嘉豪,嘉欣,子涵,黑子} Basketball_set {张三,王林,王俊凯,杨洋,嘉豪,嘉欣,子涵} french_set {十三,水娘,大炮,王俊凯,杨洋,黑子} art_set {杨洋,王俊凯,迪丽热巴,杨紫,张一山} print(f同时选修了法语和艺术的同学有{french_set.intersection(art_set)}) print(f同时选修了法语和艺术的同学有{french_set art_set}) print(f同时选修了所有四门课的学生有{football_set Basketball_set french_set art_set}) print(f选修了足球但是没有选修篮球的学生有{football_set.difference(Basketball_set)}) print(f选修了足球但是没有选修篮球的学生有{football_set - Basketball_set}) fb {s for s in football_set if s not in Basketball_set} print(f选修了足球但是没有选修篮球的学生有{fb}) # student football_set.union(Basketball_set).union(french_set).union(art_set)或 student football_set | Basketball_set | french_set | art_set student_list [*football_set,*Basketball_set,*french_set,*art_set] for s in student: print(f{s}同学选修的课程数量是{student_list.count(s)})五、字典dict1、介绍存储的是键值对key:value类型的数据可以根据key找到对应的数据键key不可以重复可以修改定义字典名称 {keyvaluekeyvalue.......}空字典字典名称 {} 或 字典名称 dict根据key获取value值 字典名称[key]ps字典中的value可以是任何类型的值而key不可以是可变类型如listtuplesetdict2、方法方法解释实例字典名称[key] value往指定字典中添加/修改键值对dict1[嘉豪] 400字典名称.pop(key)删除指定的key并返回key对应的valuesorce dict1.pop(”张三“)del 字典名称[key]删除字典中指定的键值对del dict1[嘉豪]字典名称[key] 或字典名称.get(key)获取值dict1[嘉豪]字典名称.keys()获取所有的keydict1.keys()字典名称.values()获取所有的valuesdict1.values()字典名称.items()获取所有的key - values键值对,每个对以元组形式存储dict1.items()#定义字典 dict1 {张三:605,李四:700,王五:497,1:20,2.5:30}#key除了数据容器其他都可以 #查询值 print(dict1) #{张三: 605, 李四: 700, 王五: 497, 1: 20, 2.5: 30} print(dict1.keys()) #查询所有的key dict_keys([张三, 李四, 王五, 1, 2.5]) print(dict1.values()) #查询所有的value dict_values([605, 700, 497, 20, 30]) print(dict1.items()) #查询所有的键值对 dict_items([(张三, 605), (李四, 700), (王五, 497), (1, 20), (2.5, 30)]) print(dict1[张三],dict1.get(张三)) #查询指定key所对应的值605 605 #添加值/修改值 dict1[嘉豪] 400 dict1[张三] 800 print(f张三的值为”{dict1[张三]}添加的值为{dict1[嘉豪]}) #张三的值为”800添加的值为400 #删除值 sorce1 dict1.pop(张三) print(sorce1,dict1) #800 {李四: 700, 王五: 497, 1: 20, 2.5: 30, 嘉豪: 400} del dict1[嘉豪] print(dict1) #{李四: 700, 王五: 497, 1: 20, 2.5: 30} #遍历 for k in dict1.keys(): print(f{k}: {dict1[k]}) print(--------------------------) for i in dict1.items(): print(f{i[0]}: {i[1]})3、案例开发一个购物车管理系统实现商品信息的添加、修改、删除、查询功能。系统是由字典结果存储商品数据通过控制台菜单与用户交互具体功能如下1、添加购物车用户更具提示录入商品名称、以及该商品的价格、数量保存该商品信息到购物车2、修改购物车要求用户输入要修改的购物车商品名称然后再提示输入该商品的价格、数量、输入完成后修改该商品的信息3、删除购物车要求用户输入要删除的购物车名称根据名称删除购物车中的商品4、查询购物车将购物车中的商品信息展示出来格式为“商品名称×××”“商品价格×××”“商品数量×××”、5、退出购物车#用字典包字典的方法 #eg:Shopping {洗发水{数量:12,价格:13.4}} #则Shopping的key就是洗发水我们给它起个名字叫name #value就是一个新集合{数量:12,价格:13.4}里面的主键只有数量和价格就表示为num和pir #则Shopping[name] {num: , pir: } print(1、添加购物车\n2、修改购物车\n3、删除购物车\n4、查询购物车\n5、退出购物车) Shopping {} while True : s int(input(请输入要执行的操作)) match s : #添加商品 case 1: name input(请输入商品的名称) pir float(input(f请输入{name}的单价)) num int(input(f请输入{name}的数量)) Shopping[name] {数量:num,单价:pir} print(f添加{name}成功\t数量{num}\t单价{pir},) #修改商品 case 2: name_1 input(请输入要修改的商品名称) if name_1 not in Shopping: print(你输入的商品不存在) else: pir_1 float(input(f请输入{name_1}的新单格)) num_1 int(input(f请输入{name_1}的新数量)) Shopping[name_1] {数量: num_1,单价:pir_1} #删除商品 case 3: num_3 input(请输入要删除的商品名称) if num_3 not in Shopping: print(你输入的商品不存在) else: del Shopping[num_3] print(商品成功删除) #查询商品 case 4: if Shopping: for i in Shopping.keys(): j Shopping[i] #把内嵌字典用j表示 print(f商品名{i} \t商品单价{j[单价]}\t商品数量{j[数量]}) else: print(没有商品) #退出购物 case 5: print(退出购物车) break case _: print(非法操作不支持)