
概述列表可变有序元组不可变有序字典可变无序 # Python3.7之后变为有序集合可变无序字符串不可变有序range不可变有序注意zip, filter, enumerate, map不是序列而是迭代器因此返回的对象不支持进行len切片的操作但可以正常进行max、sum操作以及使用 sorted 函数排序这些操作会消耗迭代器序列操作常用内置函数1. all, anyall(序列)所有元素全True则返回Trueany(序列)有元素True则返回True2. len, max, min, sumlen(序列)返回序列中元素的个数其余见第一章常用内置函数3. zip, enumerate等见第一章常用内置函数列表 list1. 列表创建lst list(序列)lst [元素1, 元素2, 元素3, ...]2. 列表连接与 * 列表扩展 表示列表连接例如lst lst1 lst2* 表示列表扩展例如lst [1, 2, 3] * 3 # 结果为[1, 2, 3, 1, 2, 3]注意乘号是复制列表的引用不是直接复制原列表的值例如x [[None] * 2] * 3 # [[None, None], [None, None], [None, None]] x[0][0] 5 # [[5, None], [5, None], [5, None]]3. 增删查改、逆序、排序# 增 lst.append(元素) # 尾部追加元素 lst.extend(序列) # 尾部追加序列中所有元素 # 删 lst.remove(x) # 删除第一个值为x的元素x不存在抛ValueError del lst[idx] # 使用del命令删除下标idx的元素 lst.pop(idx-1) # 删除下标为idx的元素默认为-1即最后一个并返回该元素的值索引超限抛IndexError # 查 lst.index(x) # 返回第一个值为x的元素的下标x不存在抛ValueError lst[idx] # 返回下标idx元素索引超限抛IndexError lst.count(x) # 返回x出现次数未出现则为0 x in lst # in关键字查看x是否在列表中不在False在True # 改 lst.insert(idx, x) # 在下标idx插入x插入后下标idx位置为x lst[idx] newx # 下标idx元素修改为newx # 逆序 lst.reverse() # 原地操作无返回值 # 排序 lst.sort(keyNone, reverseFalse) # 原地操作无返回值根据key排序reverse为True则逆序 lst sorted(lst, keyNone) # 有返回值使用内置函数对列表排序删除时的错误删法因迭代器会不断1而删除元素后后方元素会递补导致迭代器和部分元素错过正确删法正确删法应该从后往前删4. 切片方法lst[起始:终止:步长]左闭右开[起始终止)切片不会因下标越界抛出异常会在列表尾部截断或返回空列表在区间[起始终止)按照步长切要想切出元素则必须起始 终止 且 步长为正起始 终止 且 步长为负起始位和终止位默认值根据步长情况步长为正数或不填起始默认0终止默认len(lst)步长为负数起始默认-1终止默认-len(lst)-1若切片起始、终止均不填只填了步长形如lst[::步长]则切片情况如下根据步长情况步长为空- 为lst[::]等价于lst[:]步长为1步长为正数- 从 [0, len(lst)) 按步长切步长为负数- 从[-1, -len(lst)-1) 按步长切此时为倒着切做题时先把负下标转化成正下标负下标 len(lst) 正下标5. 用切片原地操作修改列表# 增 lst[idx:idx] lst2 # 在idx处插入lst2中所有元素 # 删 lst[切片] [] # 删除被切到的值 del lst[切片] # 删除切片部分 # 改 lst[切片(连续步长为1省略)] lst2 # 将连续切片切到的部分改为lst2中元素 lst[切片(不连续)] 和切到的部分元素个数一样多的列表 # 切片不连续两侧元素必须一样多被切到的值一一对应改成右边列表中元素6. 切片只复制引用如果原列表中只包含整数、实数、复数等基本类型或元组、字符串等不可变类型的数据修改其中一个切片不会影响原列表和其它切片如果有列表等可变序列对它们进行修改则会影响原列表和其它切片仅含整数与含整数、列表的列表的切片对比根据引用对被引用的列表进行了操作但指针的朝向不变列表推导式元组、字典、集合也有类似的推导式1. 创建lst [表达式 for item in 可迭代对象]2. 嵌套列表推导式嵌套从左往右嵌套# 假设有lstt列表为列表的列表如[[1, 2, 3], [4, 5, 6], [7, 8, 9]] result [a2 * a2 for a1 in lstt for a2 in a1] # 等价于 result [] for a1 in lstt: for a2 in a1: result.append(a2 * a2)3. 条件判断过滤条件、三元表达式可以同时使用# 过滤条件 lst [表达式 for item in 可迭代对象 if 过滤条件表达式] # 可迭代对象中满足条件的经表达式处理放进列表中 # 三元表达式 lst [表达式1 if 条件表达式 else 表达式2 for item in 可迭代对象] # 可迭代对象中所有满足表达式则经表达式1处理不满足经表达式2处理 # 同时使用过滤条件、三元表达式 lst [表达式1 if 条件表达式 else 表达式2 for item in 可迭代对象 if 过滤条件表达式]4. 应用矩阵转置matrix [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]# 下标i从0-3分别构造里层列表里层列表中元素为matrix中每个元素的第i个元素T [[item[i] for item in matrix] for i in range(4)]求100以内素数# 筛选2-100中所有数p满足对于从2-p^0.5的所有数dp%d都不为0[p for p in range(2, 100) if all(p%d for d in range(2, int(p**0.5)1))]元组 tuple元组不可变有序用()表示1. 元组创建tup1 tuple(序列)tup1 (元素1, 元素2, 元素3, ...)2. 空元组与单元素元组注意单元素元组必须在元素后加上逗号否则会退化成元素本身空元组 tup1 ()单元素元组 tup2 (元素1,)元组中存储的是引用元组中包含可变对象的引用这些对象可变但引用不能改变# 不改变引用的情形 x ([1, 2, 3], 4) x[0].append(4) print(x) ([1, 2, 3, 4], 4) # 试图改变引用的情形报错 x ([1, 2, 3], 4) x[0] x[0] [4] # 此语句返回新列表会改变原来的引用报错 print(x) 报错 字典 dict字典可变无序# Python3.7之后版本变为有序字典中元素为键值对键需为不可变的数据1. 字典创建dict1 dict(键名1值1, 键名2值2, 键名3值3, ...)dict1 {键1:值1, 键2:值2, 键3:值3, ...}2. 空字典dict1 {}#表示空字典注意与空集合 a set() 区分3. get, items, keys, valuesdict1 {A:12, C:22, W:S} # get方法 # dict1.get(键名) # 返回键对应的值键不存在返回None print(dict1.get(A)) print(dict1.get(B)) 12 None # dict1.get(键名, 默认返回值) # 返回键对应的值键不存在返回默认值 print(dict1.get(A, mmmm)) print(dict1.get(B, mmmm)) 12 mmmm # items方法返回字典元素 for item in dict1.items(): print(item) (A, 12) (C, 22) (W, S) # items配合序列解包 for key, value in dict1.items(): print(key, value) A 12 C 22 W S # keys方法返回字典的键 print(dict1.keys()) dict_keys([A, C, W]) # 直接使用字典名默认使用字典的键 for key in dict1: print(key) A C W # values方法返回字典的值 print(dict1.values()) dict_values([12, 22, S]) 4. 元素增删改使用指定键给字典赋值键存在修改其值键不存在创建新键值对dict1 {A:12, C:22, W:S} print(dict1) {A:12, C:22, W:S} dict1[A] 15 print(dict1) {A:15, C:22, W:S} dict1[B] 22 print(dict1) {A:15, C:22, W:S, B:22} update方法更新dict1 {A:12, C:22, W:S} dict2 {A:17, B:21, K:P} # 将dict1更新dict2中的键值对存在则修改不存在则新增 dict1.update(dict2) print(dict1) {A:17, C:22, W:S, B:21, K:P} 元素删除del命令pop, popitemdict1 {A:12, C:22, W:S, B:21, K:P} # del命令删除一个键值对 del dict1[A] print(dict1) {C:22, W:S, B:21, K:P} # pop方法根据键名删除键值对并返回一个值可指定默认值 # dict1.pop(键名, 默认值) print(dict1.pop(C)) print(dict1) 22 {W:S, B:21, K:P} # popitem方法随机删除一个键值对并返回元素(Python 3.7后弹出最后插入的键值对)空字典则KeyError print(dict1.popitem()) print(dict1) 可能为 (K, P) {W: S, B: 21} 集合set集合可变无序1. 集合创建set1 set(序列)set1 {元素1, 元素2, 元素3, ...}2. 空集合空集合表示为set()# 注意与空字典区分3. 删除del set1 # del命令删除整个集合set1.remove(元素) # 删除指定元素set1.pop() # 随机删除并返回一个元素4. 集合运算交| 并^对称差-差例如{1, 2, 3} {3, 4, 5} {3}{1, 2, 3} | {3, 4, 5} {1, 2, 3, 4, 5}{1, 2, 3} ^ {3, 4, 5} {1, 2, 4, 5}{1, 2, 3} - {3, 4, 5} {1, 2}5. 包含关系左为右的真子集左为右的子集例如{1} {1, 2, 3} # True为真子集{1} {1, 2, 3} # True为真子集真子集也为子集{1, 2, 3} {1, 2, 3} # False为子集但非真子集{1, 2, 3} {1, 2, 3} # True为子集注意与列表、元组区分列表、元组的、为逐个元素依次比较为比较关系例如(1, 2, 3) (1, 3) # True1123(1, 2, 3) (1, 2, 3, -1) # True, 112233对应元素相等时短元组小于长元组。