数据存储容器
1. 数据容器一种可以容纳多份数据的数据类型容器容纳的每一份元素数据称之为1个元素每一个元素都可以是任意类型的数据如字符串、数字、布尔等。列表list字符串str)元组tuple集合set字典dict2. 列表2.1列表介绍列表是数据容器中的一类是一次性可以存储多个数据元素的。定义列表名称 [元素1 元素2元素3.............]特点1.可以存储不同类型的元素2.元素有序、可以重复、元素可以修改#定义列表 - list s [1, 10, 145, 123, 123, goog, abc, True] print(type(s)) #访问列表元素 print(s[0]) print(s[-8]) #修改列表元素 s[4] gys print(s[4]) #删除列表元素 del del s[5] print(s) #遍历列表 for i in s: print(i)运行结果2.2列表-切片切片是指对操作的数据截取其中一部分的操作。列表、字符串、元组都支持切片操作。语法序列数据[开始索引结束索引步长]1.不包含结束索引位置对应的元素开始索引未指定默认为0结束索引未指定默认为列表长度步长未指定默认为12.索引采用正向、反向索引都可以3.步长是选取间隔默认步长为1s [a, b, c, d, e, f, g, h, j] #切片操作 s[开始索引:结束索引:步长] print(s[0:5:1]) print(type(s[0:5:1])) print(s[0:5]) #步长不写默认为1 print(s[:5]) #开始不写默认从0开始 print(s[0:5:2])运行结果2.3 list常用方法列表的常用方法就是指列表这种数据类型内置的常见功能添加元素、删除元素、排序等2.3.1增加元素 (Add)方法名功能说明语法示例执行后列表变化append()追加在列表的最末尾添加一个元素。最常用lst.append(4)[1, 2] - [1, 2, 4]insert()插入在指定的索引位置插入一个元素。lst.insert(1, A)[1, 2] - [1, A, 2]extend()扩展将另一个列表或任何可迭代对象里的所有元素逐一拼接到原列表末尾。lst.extend([3, 4])[1, 2] - [1, 2, 3, 4]2.3.2删除元素 (Remove)方法名功能说明语法示例执行后列表变化remove()按值删除删除列表中第一个匹配该值的元素。如果值不存在会报错。lst.remove(A)[1, A, 2] - [1, 2]pop()按位置删除弹出删除并返回指定索引位置的元素。如果不写索引默认删除并返回最后一个元素。lst.pop()[1, 2, 3] - [1, 2]clear()清空删除列表中的所有元素把它变成空列表。lst.clear()[1, 2, 3] - []2.3.3查询与统计 (Find Count)方法名功能说明语法示例返回结果index()查找索引找某个值在列表中第一次出现的索引位置。找不到会报错。lst.index(2)返回数字1count()统计次数统计某个值在列表中一共出现了多少次。lst.count(A)返回该元素出现的次数2.3.4排序与反转 (Sort Reverse)方法名功能说明语法示例执行后列表变化sort()排序对原列表里的元素按从小到大排序。加上reverseTrue参数则为从大到小。lst.sort()[3, 1, 2] - [1, 2, 3]reverse()反转把原列表的首尾顺序直接倒过来不关心大小。lst.reverse()[1, 2, 3] - [3, 2, 1]#将用户输入的10个数字存储到一个列表中并将列表中的数字进行排序输出其中的最小值和最大值以及平均值 # 1.定义列表 num_list [] # 2.将用户输入的10个数字存到列表 for i in range(10): num int(input(请输入一个有效数字)) num_list.append(num) print(数字列表, num_list) # 3.排序 num_list.sort() print(排序后的数字列表, num_list) # 4.输出最小值、最大值和平均值 sum():求和; len():获取列表长度 print(最小值为, num_list[0]) print(最大值为, num_list[-1]) print(平均值为, sum(num_list) / len(num_list))# 合并两个列表中的元素并对合并后列表元素进行去重处理,并进行排序 num_list1 [41, 0, 9, 28, 19, 99, 0, 32, 0, 18, 19] num_list2 [18, 8, 39, 38, 9, 32] # 1.合并列表 # 方法1 # for num in num_list2: # num_list1.append(num) # 方法2 #组包将多个值合并到一个容器 #num_list [*num_list1, *num_list2] #解包将列表这一类容器解开成一个一个独立的元素 # 方法3 num_list num_list1 num_list2 print(合并后的列表为, num_list) # 2.去重处理 new_list [] for num in num_list: if num not in new_list: new_list.append(num) print(去重后列表为, new_list)如何快速合并两个列表使用运算符直接合并使用*进行解包操作如何判断一个元素是否在于列表之中可用in运算符语法为元素 in 列表2.3.5列表推导式列表推导式就是按照一定的规则快速生成一个列表的方法语法格式1[要添加的值 for i in 序列/列表]语法格式2[要添加的值 for i in 序列/列表 if 条件]# 生成1~20的平方列表。--- range(1,21) #方式一: 传统方式 num_list [] for i in range(1,21): num_list.append(i**2) print(num_list) #方式二列表推导式---按照一定的规则快速生成一个列表的方法--- 语法格式[要添加的值 for i in 序列/列表] num_list2 [i**2 for i in range(1,21)] print(num_list2) # 从生成的1~20平方列表中提取所有偶数,并再次计算其平方 num_list3 [i**2 for i in num_list2 if i % 2 0] print(num_list3)、3. 字符串Str3.1字符串介绍字符串是字符的容器一个字符串中可以存放任意数量的字符。如“python” python特点不可变性无法修改、有序性字符串中的每一个字符串元素都有其对应的下标索引通过元素对应的索引就可以获取到对应的元素。注意正向索引下标从0开始反向索引下标从-1开始。3.2字符串-切片介绍切片是指对对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作语法序列对象[开始索引:结束索引:步长]注意开始索引未指定默认为0结束索引未指定默认为-1步长未指定默认为1# #字符串不可修改有序性、可迭代性 # s 今天是星期六,我在学python! # print(s) # print(s[6]) # #切片 # print(s[:6:]) # #步长: 正数从前往后截取; 负数从后往前截取 # print(s[:10:]) # print(s[::-1]) #可以用来字符串反转3.3 str常用方法3.3.1 格式化与清理 (Format Clean)用来对付那些不规范的文本比如用户手滑多打的空格或者大小写乱七八糟的拼音。方法名功能说明语法示例返回结果strip()去除两端空白删掉字符串开头和结尾的空格、换行符\n和制表符\t。爬虫和数据清洗最常用 hello .strip()helloupper()全大写将所有小写字母转为大写。python.upper()PYTHONlower()全小写将所有大写字母转为小写。常用于忽略大小写的比对VIP.lower()viptitle()标题化将每个单词的首字母变成大写。hello world.title()Hello World3.3.2 查找与替换 (Search Replace)用来在一段长文本中寻找特定内容或者进行“文本替换”。方法名功能说明语法示例返回结果find()查找位置找某个字符第一次出现的索引位置。如果找不到会返回-1不会报错。apple.find(p)1count()统计次数统计某个子字符串在文本中一共出现了几次。apple.count(p)2replace()替换内容把字符串里的“旧内容”全替换成“新内容”。I like Java.replace(Java, Python)I like Python3.3.3 拆分与拼接 (Split Join) —— ⭐ 超级重要字符串和列表List互相转换的桥梁在实际开发中极其常用。方法名功能说明语法示例返回结果split()切片/拆分按照指定的符号把一个长字符串切成好几块返回一个列表。默认按空格切。A,B,C.split(,)[A, B, C]join()拼接语法比较反直觉把一个列表里的所有字符串用指定的符号连接成一个新的长字符串。-.join([2023, 10, 01])2023-10-013.3.4 条件判断 (Check)用来做检查返回的结果永远是布尔值True或False。方法名功能说明语法示例返回结果startswith()是否以...开头常用来检查网址是否合法或文件格式。http://xxx.startswith(http)Trueendswith()是否以...结尾常用来检查文件后缀。pic.jpg.endswith(.png)Falseisdigit()是否全是纯数字检查字符串是不是全由数字组成。12345.isdigit()Trueisalpha()是否全是纯字母检查字符串是不是全由字母组成中文也算字母类。Python.isalpha()True# 案列:处理用户不规范的输入 raw_input input(请输入您的邮箱) # 1.先检验邮箱是否合法包含1个和至少1个. if raw_input.count() 1 and . in raw_input: print(邮箱有效:,raw_input) # 2. 去掉两边多余的空格和换行 clean_text raw_input.strip() print(f去除多余空格后的邮箱{clean_text}) # 3.邮箱统一转换为小写 email clean_text.lower() print(f最终邮箱{email}) else: print(有效无效)4. 元组tuple元组和列表最大的不同点在于元组一旦定义完成不可修改4.1 元组介绍元组是不可变的序列类似于列表但创建后不可修改。特点1.可以存储不同类型的元素2.元素可以重复、有序、不可修改支持索引、切片#定义元组 元组名称 (元素1, 元素2......) #定义空元组 元组名称 () 元组名称 tuple()4.2 tuple常用方法方法名功能说明语法示例返回结果index()查找位置从左到右寻找某个值返回它第一次出现的索引位置。找不到会报错。(10, 20, 30).index(20)1count()统计次数统计某个特定值在元组中一共出现了多少次。(1, 2, 2, 3).count(2)2#定义元组 t1 (1, 4, 5, 2, 6, 6, 2, 5) print(t1) print(type(t1)) #索引访问 print(t1[2]) print(t1[-3]) #切片 print(t1[:3:]) #count() 统计元素个数 print(t1.count(5)) #index() 获取元素的索引第一个元素的位置 print(t1.index(5))4.3 tuple组包和解包组包(packing):将多个值合并到一个容器元组、列表中。解包(unpacking):将容器元组、列表解开独立的元素分别赋值给多个变量。#组包 t1 (1, 2, 3, 4, 5, 6, 7, 8) t2 1, 2, 3, 4, 5, 6 #解包 a, b, c, d, e, f, g, h t1 print(a, b, c, d, e, f, g, h) #扩展解包 *收集剩余的所有元素封装列表list中 first, second, *other, last t2 print(first, second, other, last)# 计算每个学生的总分、各科平均分然后一并输出 print(学号\t 姓名\t 语文\t 数学\t 英语\t 总分\t 平均分) for s in student: #s: (s001, 小明, 82, 98, 78) total s[2] s[3] s[4] avg total / 3 print(f{s[0]}\t {s[1]}\t {s[2]}\t {s[2]}\t {s[3]}\t {total}\t {avg:.1f}) # 2.统计各科成绩的最低分、最高分、平均分并输出 #2.1 获取各科的成绩列表 chinese_score [s[2] for s in student] math_score [s[3] for s in student] english_score [s[4] for s in student] print() #2.2统计各科成绩的最低分、最高分、平均分 print(f语文最低分:{min(chinese_score)}\t 最高分:{max(chinese_score)}\t 平均分:{sum(chinese_score) / len(chinese_score)}) print(f数学最低分:{min(math_score)}\t 最高分:{max(math_score)}\t 平均分:{sum(math_score) / len(math_score)}) print(f英语最低分:{min(english_score)}\t 最高分:{max(english_score)}\t 平均分:{sum(english_score) / len(english_score)}) print() print(优秀学生) # 3.查找成绩优秀平均分大于90的学生 for s in student: total s[2] s[3] s[4] avg total / 3 if avg 90: print(f学号:{s[0]}\t 姓名:{s[1]}\t 平均分:{avg:.1f})5. 集合set5.1集合介绍介绍集合是一种无序的、不可重复的、可修改的数据容器。定义#定义 s1 {A, B, C, D, E, F} #定义空集合 S2 set()注意空集合的定义不可以使用{}{}表示的是空字典由于集合是无序的因此不支持下标索引访问。5.2 set常用方法5.2.1元素的增删与清空 (基础操作)方法名功能详细说明代码示例结果变化add(x)增加单个元素如果元素已存在则忽略。s {1, 2}s.add(3){1, 2, 3}update(*others)批量增加把列表、元组、字符串或其他集合里的元素全部加进来并自动去重。s {1}s.update([2, 3]){1, 2, 3}remove(x)严格删除删除指定元素。注意如果元素不存在会引发 KeyError 报错s {1, 2}s.remove(1){2}discard(x)安全删除删除指定元素。就算元素不存在也不会报错。s {1, 2}s.discard(99)没报错还是{1, 2}pop()随机弹出随机删除并返回一个元素。因为集合是无序的所以你不知道它会弹哪个。若集合为空会报错。s {A, B}val s.pop()删掉一个val接收被删的值clear()清空清空集合里的所有元素变成空集合set()。s {1, 2}s.clear()set()5.2.2集合的数学运算生成“新”集合这是集合最强大的地方。有两种写法操作符更简洁或方法调用兼容性更好方法里可以传列表等其他容器而操作符要求两边必须都是集合。(假设A {1, 2, 3},B {3, 4, 5})运算类型操作符写法方法写法逻辑含义返回结果交集A BA.intersection(B)找共同点都有的{3}并集A | BA.union(B)大融合去重所有的{1, 2, 3, 4, 5}差集A - BA.difference(B)我有你没有的A里剔除B的元素{1, 2}对称差集A ^ BA.symmetric_difference(B)非共同部分独有元素的集合{1, 2, 4, 5}5.2.3集合的高级数学运算方法名功能说明代码示例与结果intersection_update()原地保留交集把 A 变成它和 B 的交集。A {1, 2, 3}A.intersection_update({3, 4})结果 A 变成了{3}difference_update()原地剔除直接从 A 里面删掉 B 中也存在的元素。A {1, 2, 3}A.difference_update({3, 4})结果 A 变成了{1, 2}symmetric_difference_update()原地保留对称差集把 A 变成双方不重合的部分。同理直接修改原集合 A5.2.4关系判断返回 True / False写条件判断语句if时极其有用用来侦测两个集合之间的关系。(假设S1 {1, 2},S2 {1, 2, 3})方法名操作符功能说明语法示例返回结果issubset()是否是子集检查前者的所有元素是否都在后者里面。S1.issubset(S2)Trueissuperset()是否是超集检查前者是否包含了后者的所有元素。S2.issuperset(S1)Trueisdisjoint()无是否无交集检查两个集合是否完全没有共同元素。S1.isdisjoint({4, 5})Truefootball_set {王琳, 阿牛, 徐丽, 韩立, 唐三, 小舞, 厉飞雨, 紫灵, 妖啸天, 紫燕, 萧炎, 古帝, 霍雨浩} basketball_set {比比东, 唐昊, 奥斯卡, 贝贝, 韩立, 萧炎, 唐三, 霍雨浩, 李化元, 魂天帝, 古元, 徐三石} french_set {雅妃, 宁荣荣, 霍雨浩, 唐三, 萧炎, 彩麟, 唐舞桐, 韩立, 云韵, 李化元, 奥斯卡, 比比东} art_set {美杜莎, 霍雨浩, 姜楠, 菜头, 王冬, 唐三, 萧炎, 古熏儿, 小医仙, 云韵, 马小桃, 小舞} # 1.找出同时选修了法语和艺术的学生 fa_set french_set.intersection(art_set) print(f同时选修法语和艺术的学生{fa_set}) # 2.找出同时选修了所有课程的同学 all_set football_set basketball_set french_set art_set print(f同时选修了所有课程的同学{all_set}) # 3.找出选修了足球但是没有选修篮球的学生 ff_set football_set.difference(basketball_set) print(f选修了足球但是没有选修篮球的学生{ff_set}) # 4.统计每一个学生选修的课程数量 all_set football_set | basketball_set | french_set | art_set all_list [*football_set, *basketball_set, *french_set, *art_set] for s in all_list: print(f{s}选修了 {all_list.count(s)} 课程)6. 字典dict6.1 dict介绍dict: 里面存储的是键值对key: value类型的数据可以根据键key找到对应应的值value。定义dict1 {key: value, key: value, key: value, ...... } #定义空字典 dict1 {} dict2 dict()特点键值对key: value存储、键key不可重复、值可修改。注意字典中的value可以是任何类型的数据而key不能为可变类型如列表list、集合set、字典dictdict1 {xiaoming:660, xiaoshuai:720, xiaopeng:680, xiaomi:690} print(dict1) print(type(dict1)) #key必须是不可变类型str\int\float\tuple; 不能是dict\set\list dict2 {0:660, 1.5:720, (1,2):680, xiaomi:690} print(dict2) print(dict2[0]) dict2[0] 730 print(dict2[0])运行结果6.2 常用方法6.2.1 核心基础增、删、改、查操作类型语法示例详细说明结果查 (精准查找)d[name]通过 Key 获取 Value。注意如果 Key 不存在会直接报错 (KeyError)返回对应的值查 (安全查找)d.get(name)⭐极度推荐查找 Key 的值。如果找不到默认返回None绝对不会报错。返回值或None增 / 改d[age] 18如果age这个键不存在就是新增如果已经存在就是覆盖修改旧值。字典中多了一项删 (指定键)del d[age]删除指定的键值对。如果键不存在会报错。删掉age这一项删 (弹出并返回)val d.pop(age)删除指定的键并且把对应的值拿出来赋给变量。val等于被删的值清空d.clear()清空字典里的所有内容。变成{}6.2.2 字典的“三驾马车”视图方法当需要用for循环遍历字典或者想整体查看字典内容时这三个方法是必不可少的。它们会返回类似列表的“视图对象”。(假设字典user {name: Tom, age: 20, vip: True})方法名功能说明语法示例返回结果概要keys()拿走所有的“锁”返回字典里所有的键Key。user.keys()[name, age, vip]values()拿走所有的“宝物”返回字典里所有的值Value。user.values()[Tom, 20, True]items()连锁带宝物全拿返回所有的键值对每一个键值对打包成一个元组。user.items()[(name, Tom), ...]6.2.3 进阶实用方法在处理复杂业务逻辑比如合并配置、统计频率时这些方法能帮你省去写一堆if-else的麻烦。方法名功能说明语法示例update()批量更新/合并把另一个字典或键值对序列里的内容合并到当前字典中。如果有相同的键新字典的值会覆盖旧值。d1.update(d2)setdefault()佛系赋值如果键存在返回对应的值什么都不做如果键不存在才增加这个键并赋给它一个默认值。d.setdefault(score, 60)popitem()删除最后一项删除并返回字典中最后被加进去的那一个键值对以元组形式返回。k, v d.popitem()dict1 {xiaoming:660, xiaoshuai:720, xiaopeng:680, xiaomi:690} #增加 dict1[xiaohua] 700 print(dict1) print(dict1[xiaohua]) #修改 dict1[xiaohua] 725 print(dict1[xiaohua]) #查找 value1 dict1[xiaoming] value2 dict1.get(xiaoming) print(value1, value2) print(dict1.keys()) #获取所有的key print(dict1.values()) #获取字典里所有的值 print(dict1.items()) #获取所有的键值对 key:value #删除 value3 dict1.pop(xiaohua) print(value3)运行结果;7. 数据容器总结与对比特性字符串 (str)列表 (list)元组 (tuple)集合 (set)字典 (dict)有序性有序有序有序无序有序(3.7)重复元素允许允许允许不允许key不允许可变性不可变可变不可变可变可变索引访问支持支持支持不支持不支持切片操作支持支持支持不支持不支持使用场景文本处理有序可重复数据集合固定数据记录去重数据集合键值对