Python3 - 数据容器

📅 发布时间:2026/9/7 22:04:23
Python3 - 数据容器
摘要本文系统介绍 Python 中的五类数据容器——列表、字符串、元组、集合和字典。文章从数据容器的基本概念出发逐一讲解各类容器的定义方式、核心特点、常用方法与典型应用案例并通过大量可运行的代码示例帮助读者快速掌握批量存储与处理数据的技巧。目录前言一、列表二、字符串三、元组四、集合五、字典总结前言前面Python入门提到过一个变量可以用来存储单个数据。如果我们需要存储大量数据就需要定义大量的变量太过繁琐。Python中有这样的用来批量存储数据的容器。数据容器指的是一种可以容纳多份数据的数据类型容器容纳的每一份数据称之为1个元素每一个元素都可以是任意类型的数据如字符串、数值、布尔等。在Python中我们通常会根据容器中的元素是否有序、是否支持重复元素、是否可以修改等特性将其细分为如下五类数据容器列表list字符串str元组tuple集合set字典dict一、列表列表是数据容器中的一类可以一次性存储多个数据元素。特点①可以存储不同类型的元素②元素有序③支持重复元素④可以修改。基础操作# 一、列表[list] list1 [1, 6, 6, 6, Hello, 5.88, None, 18, False] # 定义有值列表 list2 [] # 定义空列表 法一 list3 list() # 定义空列表 法二 # 根据索引访问列表元素有序 -- 有索引 -- 可以用索引访问元素 print(list1[4]) # 正向索引从前往后数 0123... print(list1[-3]) # 反向索引从后往前数 -1-2-3... for i in list1: # 遍历列表 print(i) list1[-1] True # 修改列表元素 print(list1) del list1[-3] # 删除列表元素 print(list1) # enumerate 语句的作用就是在遍历可迭代对象时, 同时获取元素的索引和值 (索引从0开始) for i, e in enumerate(list1): print(i , : , e) print(type(list1)) # 输出类型 # 列表切片截取其中一部分数据 顾头不顾尾end取不到 # 语法序列[start, end, step] # start - 开始索引end - 结束索引step - 步长/选取间隔。 list_num [12.7, 56, 空, abc, 83.34, 73, True, 66, 100] print(list_num[2:6:2]) # 从索引2取到索引5隔一个数取一个 print(list_num[:5:2]) # 省略开始索引默认从0开始 print(list_num[3::2]) # 省略结束索引默认为列表长度取到末尾 print(list_num[1:6]) # 省略步长默认选取间隔为1 print(list_num[-2:-6:-1]) # 从后往前取逆序 print(list_num[::]) # 从头取到尾 法一 print(list_num[:]) # 从头取到尾 法二 print(list_num[::-1]) # 列表逆序输出 print( # * 30) # 7个列表常用方法 list1 [ds, 58, 屈, 才, 29, True, 33.42, 3005, 423857] print(list1) print( # * 30) list1.append(才) # ①append(元素) 在【原】列表末尾追加元素 print(list1) list1.insert(-3, 才) # ②insert(索引, 元素) 在【原】列表指定索引前插入元素 print(list1) list1.remove(才) # ③remove(元素) 删除【原】列表中第一个匹配到的值 print(list1) list1.pop(1) # ④pop(索引) 删除【原】列表中指定索引位置的元素 list1.pop() # 未指定默认删最后一个 print(list1) list2 [4, 7855, 36, 4, 85, 78, 4, 20, 550] list2.sort() # ⑤sort() 对【原】列表进行排序默认升序小--大。注意数据类型一致才能排 print(list2) list2.sort(reverseTrue) # 参数reverse默认为False改为True是降序 print(list2) list2.reverse() # ⑥reverse() 反转列表元素 print(list2) num list2.count(4) # ⑦count(元素) 统计某元素的个数 print(num)案例# 1. 将用户输入的10个数字存储到一个列表中并将列表中的数字进行排序, 输出其中的最小值、最大值和平均值。 list1 [] for i in range(10): num int(input(请输入一个数字)) list1.append(num) list1.sort() print(list1) print(最小值为%s最大值为%s % (list1[0], list1[-1])) # 排序后可以利用索引输出最大最小值 # print(最小值为%s最大值为%s % (min(list1), max(list1))) # max() 获取最大值min() 获取最小值 print(f平均值为{sum(list1) / len(list1)}) # sum() 求和len() 获取列表中的元素个数 # 2. 合并两个列表中的元素并对合并的结果进行去重处理(去除列表中的重复元素)。 num_list1 [19, 23, 54, 64, 875, 20, 109, 232, 123, 54] num_list2 [55, 80, 72, 35, 60, 123, 54, 29, 91] # 法一遍历一个列表依次取出元素放入另一个列表 for num in num_list2: num_list1.append(num) print(合并后的原始列表: , num_list1) # 法二号合并类似字符串拼接列表1 列表2 合并列表 num_list1 num_list1 num_list2 print(合并后的原始列表: , num_list1) # 法三解包和组包*列表1 解包一个一个把数值取出新列表[*列表1, *列表2] 组包 num_list1 [*num_list1, *num_list2] print(合并后的原始列表: \n, num_list1) new_list [] for i in num_list1: if i not in new_list: # 判断元素是否在新集合中已存在就不放了 new_list.append(i) print(去除重复元素后的列表: \n, new_list) # 3、生成1-20的平方列表。 -- range(1,21) # 法一: 遍历 num_list [] for i in range(1, 21): num_list.append(i ** 2) print(num_list) # 法二: 列表推导式 --- 就是按照一定的规则快速生成一个列表的方法 --- 语法格式1: [要插入的值 for i in 可迭代对象] num_list2 [i**2 for i in range(1, 21)] print(num_list2[:]) # 4、从一个数字列表中提取所有偶数并计算其平方组成一个新的列表。 --- 判断偶数: num % 2 0 # 列表推导式 --- 语法格式2: [要插入的值 for i in 序列/列表 if 条件] num_list [12, 32, 45, 77, 80, 92, 33, 57, 97, 98, 110, 111, 122] new_list [i**2 for i in num_list if i % 2 0] print(new_list[::])二、字符串字符串是字符的容器一个字符串中可以存放任意数量的字符。常用定义方法有单引号、双引号、三引号。特点①元素有序②支持重复元素③无法修改④可迭代。# 二、字符串“str” str_data Hello-EveryBody # 索引 print(str_data[-6]) # 遍历 for i in str_data: print(i) # 字符串切片 print(str_data[3:13:2]) print(str_data[2:-3]) print(str_data[:]) print(str_data[::-1]) # 7个字符串常用方法 str1 -Hello-Python-Hello-World - index str1.find(l) # ①find(子串) 查找指定字符串第一次出现的索引位置找到返回正向索引值找不到返回-1 print(index) print(str1.count(l)) # ②count(子串) 统计子字符串在指定字符串中出现的次数 str2 str1.upper() # ③upper() 全转为大写lower() 全转为小写 print(str2) print(str1) # 所有修改操作都是在拷贝串上作用【原】字符串不变 str3 str1.lower() print(str3) slist str1.split(o) # ④split(子串) 将字符串按照指定字符串切割成 列表 print(slist) print(str1.strip()) # ⑤strip(子串) 去除首尾的空格或指定字符 print(str1.strip(-)) print(str1.replace(-, )) # ⑥replace(旧子串, 新子串) 将字符串中的指定子串替换为新的内容 print(str1.startswith(-)) # ⑦startswith(子串) / endswith(子串) 判断是否以指定的字符串开头/结尾,返回布尔值 print(str1.endswith(-)) # 1. 邮箱格式验证用户输入一个邮箱, 验证邮箱格式是否正确(包含一个和至少一个.), 如果输入正确, 输出邮箱格式正确, 否则输出邮箱格式错误。 mail input(请输入一个邮箱) if mail.count()1 and . in mail: # 如果 的数量为1并且 . 存在于字符串中 print(邮箱格式正确) else: print(邮箱格式错误)三、元组元组是不可变的序列类似于列表但创建后不能修改。特点①可以存储不同类型的元素②元素有序③支持重复元素④不可以修改。# 三、元组tuple tuple1 (1, None, 3, 6, 10, 4, asdf, 6, 7, True, 9, 6, 10) # 定义有值元组 tuple2 () # 定义空元组 法一 tuple3 tuple() # 定义空元组 法二 tuple4 (12,) # 定义一个元素的元组 -- 逗号才是元组的灵魂括号只是礼貌的装饰。 print(tuple1[-3]) # 索引访问 for i in tuple1: # 遍历 print(i) print(tuple1[1:11:3]) # 元组切片 # 2个元组常用方法 print(tuple1.count(6)) # ①count(元素) 统计元组中元素的个数 print(tuple1.index(10)) # ②index(元素) 查找某个元素在元组中第一次出现的索引位置 # 组包与解包 # - 组包Packing将多个值合并到一个容器元组、列表中。 # - 解包Unpacking将容器(元组、列表)解开成独立的元素分别赋值给多个变量。 # 说明在元组解包时* 表示收集剩余的所有元素允许我们处理不确定数量的元素生成列表以便于可以进行进一步的处理。 t1 1, 3, 5, 7, 9 # 既是定义元组也是组包 print(t1) a, b, c, d, e t1 # 基础解包 print(a, b, c, d, e) f, *g, h t1 # *扩展解包*收集剩余的所有元素并封装在列表中 print(f, g, h) *x, t1 # 只用一个元素解包要加,。 相当于把元组转化成了列表 print(x) a, b, c 11, 22, 33 # 交换数值也用到了元组的组包、解包思想 c, a, b a, b, c print(a, b, c) # 根据如下提供的学生成绩单完成如下需求 # 1. 计算每个学生的总分、各科平均分然后一并输出出来。 # 2. 统计各科成绩的最低分、最高分、平均分并输出。 # 3. 查找成绩优秀平均分大于90的学生并输出。 students ( (S001, 王林, 85, 92, 78), (S002, 李慕婉, 92, 88, 95), (S003, 十三, 78, 85, 82), (S004, 曾牛, 88, 79, 91), (S005, 周轶, 95, 96, 89), (S006, 王卓, 76, 82, 77), (S007, 红蝶, 89, 91, 94), (S008, 徐立国, 75, 69, 82), (S009, 许木, 86, 89, 98), (S010, 遁天, 66, 59, 72) ) # 法一下标法 print(所有学生的总分、各科平均分如下) for stu in students: total stu[2] stu[3] stu[4] avg total / 3 print(f{stu[0]}号学生 {stu[1]} 的总分为{total}平均分为{avg:.2f}) # {avg:.2f}表示该浮点数保留两位小数输出 # 列表推导式 chinese_list [stu[2] for stu in students] math_list [stu[3] for stu in students] english_list [stu[4] for stu in students] print(f语文的最低分{min(chinese_list)}最高分{max(chinese_list)}平均分{sum(chinese_list) / len(chinese_list)}) print(f数学的最低分{min(math_list)}最高分{max(math_list)}平均分{sum(math_list) / len(math_list)}) print(f英语的最低分{min(english_list)}最高分{max(english_list)}平均分{sum(english_list) / len(english_list)}) # 法二解包法 print(成绩优秀平均分大于90的学生信息如下) for no, name, chinese, math, english in students: total chinese math english avg total / 3 if avg 90: print(f{no}号学生 {name} 的总分为{total}平均分为{avg:.2f})四、集合特点①元素无序②不支持重复元素会自动去重③可以修改。# 四、集合{set} set1 {1, 33, 牛, 马, None, 3, 5} # 定义有值集合 set2 set() # 定义空集合 set3 {} # 不能用这种方法定义空集合这是定义空字典的 print(type(set3)) #class dict # 遍历集合元素 for item in set1: print(item) # 7个集合常用方法 set1.add(python) # ①add(元素) 添加元素 print(set1) set1.remove(3) # ②remove(元素) 删除指定元素 print(set1) set1.pop() # ③pop() 随机删除元素 print(set1) set1.clear() # ④clear() 清空集合 print(set1) s2 {A, B, C, D, E, X, Y} s3 {C, E, Y, Z} print(s2.difference(s3)) # ⑤difference() 求差集 - print(s3.difference(s2)) print(s2.union(s3)) # ⑥union() 求并集 | print(s2.intersection(s3)) # ⑦intersection() 求交集 # 需求根据提供的班级学生的选课情况完成如下需求 # 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 basketball_set football_set}) # print(f选了足球但没有选篮球的有{football_set.difference(basketball_set)}) # 法一difference() # print(f选了足球但没有选篮球的有{football_set - basketball_set}) # 法二运算符- d_set {s for s in football_set if s not in basketball_set} # 法三集合推导式 print(f选了足球但没有选篮球的有{d_set}) stu_set football_set | basketball_set | french_set | art_set # 并集获取学生名单 集合 course_list [*football_set, *basketball_set, *french_set, *art_set] # 组包获取课程数量 列表 for stu in stu_set: print(f{stu}选修了{course_list.count(stu)}门课程)五、字典字典使用键值对keyvalue来存储数据键key与值value一一对应通过键可以快速找到对应的值。value可以是任意类型但key不能是可变的数据类型列表、集合、字典。特点①键值对keyvalue存储②元素有序但不支持索引访问和切片操作③键key不能重复如果重复前面的值会被后面的值覆盖④可以修改。基础操作# 五、字典{dict} dict1 {乌昂:750, 王林:670, 李慕婉:608, 徐立国:580, 韩立:688} # 定义有值字典 print(dict1) dict2 {} # 定义空字典 法一 dict3 dict() # 定义空字典 法二 print(dict1[乌昂]) # 访问 dict1[许建] 698 # 添加元素 key不存在于原字典时是添加 print(dict1) dict1[许建] 717 # 修改元素 key存在于原字典时是修改 print(dict1) del dict1[韩立] # 删除元素 法一删除字典中指定的键值对 dict1.pop(徐立国) # 删除元素 法二删除字典中指定的key并返回该key对应的value print(dict1) print(dict1[王林]) # 根据key查询value 法一key不存在会报错 print(dict1.get(王林)) # 根据key查询value 法二key不存在会返回None # 3个字典常用方法遍历 print(dict1.keys()) # 获取所有key print(dict1.values()) # 获取所有value for k, v in dict1.items(): # 获取所有键值对以元组方式输出 print(k, ----, v)案例 开发一个购物车管理系统实现商品信息的添加、修改、删除、查询和统计功能。系统使用嵌套字典结构存储商品数据通过控制台菜单与用户交互。 具体功能如下 1. 添加购物车用户根据提示录入商品名称、以及该商品的价格、数量保存该商品信息到购物车。 2. 修改购物车要求用户输入要修改的购物车商品名称然后再提示输入该商品的价格、数量输入完成后修改该商品信息。 3. 删除购物车要求用户输入要删除的购物车名称根据名称删除购物车中的商品。 4. 查询购物车将购物车中的商品信息展示出来格式为商品名称: xxx, 商品价格: xxx, 商品数量: xxx。 5. 退出购物车 结构: shopping_cart { Meta80: {price: 6999, num: 2}, 鼠标: {...} } shopping_cart {} menu ########### 购物车系统 ########## # 1. 添加购物车 # # 2. 修改购物车 # # 3. 删除购物车 # # 4. 查询购物车 # # 5. 退出购物车 # ############################### print(欢迎使用购物车管理系统 ~) while True: print(menu) oper input(请选择要执行的操作1-5) match oper: case 1: goods_name input(请输入商品名称) if goods_name in shopping_cart: # 考虑代码健壮性 print(该商品已经在购物车中请勿重复添加) continue goods_price float(input(请输入商品价格)) goods_num int(input(请输入商品数量)) shopping_cart[goods_name] {price:goods_price, num:goods_num} print(商品添加成功~) case 2: goods_name input(请输入商品名称) if goods_name not in shopping_cart: print(该商品不在购物车中无法修改) continue goods_price float(input(请输入商品价格)) goods_num int(input(请输入商品数量)) shopping_cart[goods_name] {price: goods_price, num: goods_num} print(购物车中商品修改成功~) case 3: goods_name input(请输入商品名称) if goods_name not in shopping_cart: print(该商品不在购物车中无法删除) continue del shopping_cart[goods_name] print(购物车中商品删除成功~) case 4: for goods_name, goods_info in shopping_cart.items(): print(f商品名称: {goods_name}, 商品价格: {goods_info.get(price)}, 商品数量: {goods_info[num]}) case 5: print(欢迎下次光临~) break case _: print(输入有误请重新输入) 开发一个教务管理系统在该系统中可以维护和管理学员的成绩信息具体需求如下 1. 添加学生信息根据提示录入学生姓名、语文、数学、英语成绩录入完成保存到系统中。 2. 修改学生信息要求输入要修改的学生姓名然后再提示输入语文、数学、英语成绩输入完成后修改学员信息。 3. 删除学生信息要求输入要删除的学生姓名根据姓名删除学生信息。 4. 查询学生信息要求输入要查询的学生姓名根据姓名查询学生信息并输出。 5. 列出所有学生遍历所有学生信息并输出。 6. 统计班级成绩统计班级语文、数学、英语成绩的最高分、最低分、平均分以及语文、数学、英语最高分和最低分的学员姓名。 7. 退出系统。 数据结构student_scores { 李斯 : {chinese:93, math:98, english:96}, 汪芜 : {chinese:85, math:88, english:83}, 赵柳 : {chinese:36, math:94, english:85}, 詹厦 : {chinese:93, math:49, english:91}, 钱耳 : {chinese:74, math:72, english:42} } menu # # # # # # # # # # # # # # # # # # # # # # # # # # 【菜单】 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 1. 添加学生信息 2. 修改学生信息 3. 删除学生信息 4. 查询学生信息 5. 列出所有学生 6. 统计班级成绩 7. 退出系统 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # print(欢迎使用教务管理系统 ~) student_scores {} while True: print(menu) choice input(请选择要执行的操作1-7) match choice: case 1: stu_name input(请输入学生姓名) if stu_name in student_scores: print(该学生已存在请勿重复添加) continue chinese_score float(input(请输入该生的语文成绩)) math_score float(input(请输入该生的数学成绩)) english_score float(input(请输入该生的英语成绩)) student_scores[stu_name] {chinese: chinese_score, math: math_score, english: english_score} print(f{stu_name} 的信息添加成功~~) case 2: stu_name input(请输入学生姓名) if stu_name not in student_scores: print(该学生不存在无法修改) continue chinese_score float(input(请输入该生的语文成绩)) math_score float(input(请输入该生的数学成绩)) english_score float(input(请输入该生的英语成绩)) student_scores[stu_name] {chinese: chinese_score, math: math_score, english: english_score} print(f{stu_name} 的信息修改成功~~) case 3: stu_name input(请输入学生姓名) if stu_name not in student_scores: print(该学生不存在无需删除) continue student_scores.pop(stu_name) print(f{stu_name} 的信息删除成功~~) case 4: stu_name input(请输入学生姓名) if stu_name not in student_scores: print(该学生不存在无法查询) continue print(查询到{}的信息如下.format(stu_name)) stu_info student_scores[stu_name] print( f姓名{stu_name} 语文成绩{stu_info[chinese]}数学成绩{stu_info[math]}英语成绩{stu_info[english]}) case 5: if not student_scores: print(当前系统中没有学生) continue for name, info in student_scores.items(): print(f姓名{name} 语文成绩{info[chinese]}数学成绩{info[math]}英语成绩{info[english]}) case 6: if not student_scores: print(当前系统中没有学生) continue # 6. 统计班级成绩统计班级语文、数学、英语成绩的最高分、最低分、平均分以及语文、数学、英语最高分和最低分的学员姓名。 chinese_list [score[chinese] for score in student_scores.values()] chinese_max max(chinese_list) chinese_min min(chinese_list) chinese_avg sum(chinese_list) / len(chinese_list) print(f语文--最高分{chinese_max}最低分{chinese_min}平均分{chinese_avg}) chinese_max_name {name for name, score in student_scores.items() if score[chinese] chinese_max} chinese_min_name {name for name, score in student_scores.items() if score[chinese] chinese_min} print(f语文得最高分的学生为 {chinese_max_name}得最低分的学生为 {chinese_min_name}) math_list [score[math] for score in student_scores.values()] math_max max(math_list) math_min min(math_list) math_avg sum(math_list) / len(math_list) print(f数学--最高分{math_max}最低分{math_min}平均分{math_avg}) math_max_name {name for name, score in student_scores.items() if score[math] math_max} math_min_name {name for name, score in student_scores.items() if score[math] math_min} print(f数学得最高分的学生为 {math_max_name}得最低分的学生为 {math_min_name}) english_list [score[english] for score in student_scores.values()] english_max max(english_list) english_min min(english_list) english_avg sum(english_list) / len(english_list) print(f英语--最高分{english_max}最低分{english_min}平均分{english_avg}) english_max_name {name for name, score in student_scores.items() if score[english] english_max} english_min_name {name for name, score in student_scores.items() if score[english] english_min} print(f英语得最高分的学生为 {english_max_name}得最低分的学生为 {english_min_name}) case 7: print(Bye~Bye~) break case _: print(输入有误请重新输入)总结以上就是今天要讲的内容本文简单介绍了Python中数据容器的使用。如有问题欢迎指教