一 列表和元组1序列概述1列表列表是一种可修改的序列可以存储多个数据。特点使用[]表示元素之间用逗号分隔可以增加、删除、修改元素。示例edward [Edward Gumby, 42]列表可以嵌套列表中的元素也可以是列表edward [Edward Gumby, 42] john [John Smith, 50] database [edward, john]结果[ [Edward Gumby, 42], [John Smith, 50] ]2元组元组也是一种序列。特点使用()表示不可修改适合保存固定数据。因为某些数据结构要求内容不能改变所以才会有元组的提出示例person (Edward Gumby, 42)两者比较3容器Python 中可以包含其他对象的数据结构称为容器。常见容器1序列元素按照顺序排列例如list tuple元组 str特点每个元素有编号索引。a [A,B,C]2映射例如dict字典特点通过键访问数据student { name:Tom, age:20 }访问student[name]3集合set集合不属于序列不属于映射元素无序元素不能重复。s {1,2,3}2通用的序列操作21 序列索引1正向索引序列索引从0 开始示例greeting Hello对应索引索引 0 1 2 3 4 字符 H e l l o访问greeting[0]结果H2负索引Python 支持从右向左访问元素负索引规则字符 H e l l o 正索引 0 1 2 3 4 负索引 -5 -4 -3 -2 -13字符串也是序列Python 没有单独的字符类型示例Hello[1]结果e说明字符串本质上是由多个字符组成的序列4直接对序列使用索引示例Python[0] P等价于s Python s[0]5函数返回值也可以索引如果函数返回一个序列可以直接索引示例fourth input(Year: )[3]输入Year: 2005执行fourth结果56实例根据日期输出月份输入年份 月份 日期然后根据月份索引列表获取月份名称months [ January, February, March, ... ]注意索引偏移问题用户输入Month: 8列表索引January → 0 February → 1 March → 2 ... August → 7所以months[month_number-1]需要减1.使用索引生成日期后缀示例endings [st,nd,rd] 17 * [th] \ [st,nd,rd] 7 * [th] \ [st]通过endings[day_number-1]来获取日期后缀。总结months [ January, February, March, April, May, June, July, August, September, October, November, December ] # 一个列表其中包含数131对应的结尾 endings [st, nd, rd] 17 * [th] \ [st, nd, rd] 7 * [th] \ [st] year input(Year: ) month input(Month (1-12): ) day input(Day (1-31): ) month_number int(month) day_number int(day) # 别忘了将表示月和日的数减1这样才能得到正确的索引 month_name months[month_number-1] ordinal day endings[day_number-1] print(month_name ordinal , year)22 序列切片切片格式序列[start:end:step]1基本切片示例numbers [1,2,3,4,5,6,7,8,9,10]获取索引3到6的元素numbers[3:6]结果[4,5,6]2省略开始或结束索引从开头开始numbers[:3] 等价于 numbers[0:3] 结果[1,2,3]到末尾结束numbers[7:] 等价于 numbers[7:10] 结果 [8,9,10]复制整个序列numbers[:] 结果 [1,2,3,4,5,6,7,8,9,10]3负索引切片示例numbers[-3:] 表示获取最后3个元素 结果 [8,9,10]注意numbers[-3:-1] 不包含-1只包含-3 结果[8,9]4切片步长示例numbers[0:10:2] 表示从0开始每隔2个元素取一次。 结果[1,3,5,7,9]5使用负步长反向切片示例numbers[::-1] 表示反转序列 结果[10,9,8,7,6,5,4,3,2,1]6切片边界规则切片特点第一个索引包含第二个索引不包含示例numbers[3:6] 取 索引 3 4 5 不取 索引 67步长方向规则正步长从左向右numbers[1:8:2] 结果[2,4,6,8]负步长从右向左numbers[8:1:-2] 结果[9,7,5,3]23 序列相加Python 中可以使用运算符连接相同类型的序列支持元组列表和字符串1列表连接使用可以合并两个列表 [1,2,3] [4,5,6] [1,2,3,4,5,6]结果两个列表元素按顺序拼接2字符串连接字符串也属于序列可以使用。 Hello, world! Hello, world!3不同类型序列不能相加虽然列表和字符串都是序列但是类型不同不能连接 [1,2,3] world 是错误 报错 TypeError:can only concatenate list (not str) to list4)需要转换类型时如果想连接不同类型需要先转换。[1,2,3] list(abc) 结果[1,2,3,a,b,c] str(123) abc 结果123abc24 序列乘法Python 中可以使用*运算符重复序列生成新的序列。序列 * n表示将序列重复n次1字符串乘法示例 python * 5 结果pythonpythonpythonpythonpython2列表乘法 [42] * 10 [42,42,42,42,42,42,42,42,42,42]3使用乘法初始化列表sequence [None] * 10 结果[None,None,None,None,None, None,None,None,None,None]其中None表示空值没有具体内容。4注意不要使用【】*n错误使用sequence [] * 10结果【】原因空列表重复多少次仍然为空(5) 序列乘法规则序列乘法要求左边必须是序列右边必须是整数示例正确abc * 3 结果abcabcabc 错误abc * 36实例利用字符串乘法绘制图形sentence input(Sentence: ) screen_width 80 text_width len(sentence) box_width text_width 6 left_margin (screen_width - box_width) // 2其中 * left_margin表示生成指定数量的空格实现居中。绘制边框顶部 - * (box_width-2) 中间| * text_width |25 Python序列成员资格Python 可以使用in运算符判断某个元素是否存在于序列中。元素 in 序列返回结果1存在-True2不存在-False1字符串成员判断permissions rw w in permissions 结果True2列表成员判断users [mlh,foo,bar] mlh in users 结果True3子序列判断对于字符串in判断的是子字符串是否存在$$$ in $$$ Get rich now!!! $$$ 结果True注意列表判断的是完整元素[1,2] in [[1,2],[3,4]] 结果True 2 in [[1,2],[3,4]] 结果False4实例用户名和密码验证#数据库 database [ [albert,1234], [dilbert,4242], [smith,7524], [jones,9843] ] #用户输入 username input(User name: ) pin input(PIN code: ) #判断 if [username, pin] in database: print(Access granted)原理#输入 albert 1234 #形成 [albert,1234] #然后检查是否存在于database中5长度最大值最小值常用函数len获取序列长度numbers [100,34,678] len(numbers) 结果3max获取最大值max(numbers) 结果678min获取最小值min(numbers) 结果34max和min参数除了序列还可以是多个参数序列max([2,3]) 多个参数max(2,3)3列表3.1 列表list以及基本的列表操作列表list是 Python 中最重要的数据结构之一。特点有序可修改mutable支持索引、切片、拼接、重复等序列操作创建列表id1 names [Alice, Bob, Cecil]1使用list创建列表list()可以将其他序列转换为列表格式list(sequence) list(hello) 结果[h,e,l,l,o]2)修改列表元素列表可以通过索引直接修改元素。list[index] value x [1,1,1] x[1] 2 print(x) 结果[1,2,1]注意索引必须存在否则会报错。3删除列表元素使用del删除指定元素格式del list[index] 示例names [Alice,Beth,Cecil,Dee-Dee,Earl] del names[2] 结果[Alice,Beth,Dee-Dee,Earl] Cecil被删除4切片赋值列表切片不仅可以读取还可以修改格式list[start:end] new_sequence替换元素name list(Perl) name[2:] list(ar) 原列表P e r l 被替换为 r l → a r插入元素切片赋值可以插入不同长度的数据numbers [1,5] numbers[1:1] [2,3,4] 结果[1,2,3,4,5]原因numbers[1:1] 表示一个空切片相当于插入位置删除切片将切片赋值为空列表list[start:end] []示例numbers [1,2,3,4,5] numbers[1:4] [] 结果[1,5] 等价于del numbers[1:4]5切片赋值特点普通赋值只能替换一个元素x[1] 10切片赋值可以替换多个元素插入多个元素删除多个元素。x[1:3] [10,20,30]3.2 列表方法列表list是 Python 中最常用的数据结构之一。列表是可变序列可以通过方法直接修改内容。格式list.method(arguments)1append()添加元素在列表末尾添加一个元素格式list.append(value) 示例 lst [1,2,3] lst.append(4) print(lst) 结果[1,2,3,4]特点直接修改原列表不返回新列表。2clear()清空列表删除列表中的所有元素示例lst [1,2,3] lst.clear() print(lst) 结果[] 等价于 lst[:] []3copy()复制列表创建列表副本示例 a [1,2,3] b a.copy() b[1] 4 结果 a [1,2,3] b [1,4,3]区别直接赋值是两个变量指向同一个列表复制是创建新的列表4count()统计元素出现次数格式list.count(value)示例x [a,b,a,c] x.count(a) 结果25extend()扩展列表将另一个序列中的元素逐个加入列表示例 a [1,2,3] b [4,5,6] a.extend(b) 结果[1,2,3,4,5,6]extend() 与 的区别使用创建新列表原列表不变。使用extend()直接修改原列表效率更高。6index()查找元素位置返回元素第一次出现的索引格式list.index(value)示例names [we,are,the,knights] names.index(the) 结果2如果元素不存在那么就会报错names.index(abc) 报错ValueError7insert()插入元素格式list.insert(index,value)示例numbers [1,2,3,5,6] numbers.insert(3,4) 结果[1,2,3,4,5,6]也可以使用切片效果是相同的numbers[3:3] [4]8pop()删除并返回元素删除列表元素并返回删除的值默认删除最后一个x [1,2,3] x.pop() 返回3 列表变为[1,2]指定位置删除x.pop(0)pop() 应用栈结构栈后进先出示例stack [] stack.append(1) stack.append(2) stack.pop() 返回29remove()删除指定值格式list.remove(value)示例x [a,b,c] x.remove(b) 结果[a,c]注意只删除第一次出现的值不存在会报错10reverse()反转列表原地反转列表示例x [1,2,3] x.reverse() 结果[3,2,1]特点修改原列表不返回结果如果不想修改原列表可以使用reversed() 示例list(reversed(x))11sort()排序对列表进行排序示例x [4,6,2,1,7] x.sort() 结果[1,2,4,6,7]特点修改原列表返回None如果不想修改原先的列表可以使用sorted()生成排序副本y sorted(x)特点返回新列表原列表不变12sort() 高级参数reverse降序x.sort(reverseTrue) 结果[7,6,4,2,1]key指定排序规则格式list.sort(keyfunction) 示例按照字符串的长度排序 words [add,a,aaaa] words.sort(keylen) 结果[a,add,aaaa]4元组元组tuple是一种不可修改的序列。与列表list类似有序支持索引和切片可以存储多个元素。4,1 创建元组1使用逗号创建元组最重要的标志是逗号1,2,3 结果(1,2,3)2使用括号创建(1,2,3) 结果(1,2,3)注意括号不是元组的核心逗号才是。4,2 空元组创建空元组() 结果4,3 单元素元组(42) 结果42这不是元组而是普通整数。原因Python 认为(42)只是数学括号正确写法(42,) 结果(42,)单元素元组必须加逗号4,4 元组拆包元组可以直接赋值给多个变量x,y,z 1,2,3 等价于 (x,y,z) (1,2,3) 访问x[ ]4,5 tuple() 函数tuple()可以将序列转换为元组格式tuple(sequence)字符串转换tuple(abc) 结果(a,b,c)列表转换tuple([1,2,3]) 结果(1,2,3)如果参数本身是元组tuple((1,2,3))不会复制直接返回原元组4,6 元组索引和切片索引x (1,2,3) x[1] 结果2切片x[0:2] 结果(1,2)返回的仍然是元组4,7 元组为什么不能修改错误x (1,2,3) x[1] 5 报错TypeError因为元组不可变创建后元素固定。4,8 元组的应用场景1字典key字典的 key 必须不可变point (3,5) # 可以作为key2保护固定数据point (10,20)这些不希望被修改的数据