列表与元组
这次比之前内容上更丰富了, 大部分有的代码的运行结果都写上了,对于代码的和知识点的解释和说明,我都尽量以更简单的去表达 使它更容易理解,中间穿插着一些例子,这章的小知识点很碎,具体的例题也没有多,大部分都在只是知识点的解释里,所以这章的综合例题应用我准备单独开一篇,这章的知识点总结我也会单独开一篇
# 第四章 # 列表的表示 # score = [98,96,95,94,92] # names = ['萧峰','杨过','令狐冲','张无忌','郭靖'] # player1 = ['萧峰',98] # group = [['萧峰',98],['杨过',96]] # 可以列表里面放列表 # player11 = ['萧峰',98] # player12 = ['杨过',96] # players = [player11,player12] # 元素的索引和访问 names = ['萧峰','杨过','令狐冲','张无忌','郭靖'] print(names[0],names[3],names[-1],names[-4]) # 萧峰 张无忌 郭靖 杨过 # 例4-1 根据输入的数字,输出月份信息 # 要注意序号是从0开始的 monthes = ['January','February','March','April','May','June','July','August','Septemper','October','November','December'] n = eval(input('请输入整数月份:')) print(monthes[n-1]) # 注意这里 输入的月份减一才是下标 # 请输入整数月份:6 # June # 修改元素 guests = ['萧峰','杨过','令狐冲','张无忌','郭靖'] guests[-2] = '黄蓉' print(guests) # ['萧峰', '杨过', '令狐冲', '黄蓉', '郭靖'] # 增加元素 # guests.append('段誉') print(guests.append("段誉")) # ['萧峰', '杨过', '令狐冲', '黄蓉', '郭靖', '段誉'] guests.insert(2,'张三丰') print(guests) # ['萧峰', '杨过', '张三丰', '令狐冲', '黄蓉', '郭靖', '段誉'] # 删除元素 del guests[-3] print(guests) # ['萧峰', '杨过', '张三丰', '令狐冲', '郭靖', '段誉'] a = guests.pop(4) print(a) # 郭靖 print(guests) # ['萧峰', '杨过', '张三丰', '令狐冲', '段誉'] guests.pop() # 默认删除最后一个 print(guests) # ['萧峰', '杨过', '张三丰', '令狐冲'] guests.remove('萧峰') # 直接删除元素,若有重复的优先删除第一个 print(guests) # ['杨过', '张三丰', '令狐冲'] print(len(guests)) # 3 print('杨过' in guests) # True print('杨过' not in guests) # False # 查找指定元素 print(guests.index('张三丰')) # 1 # print(guests.index('杨')) # 没有这个元素,所以会报错 # Traceback (most recent call last): # File "E:\Python\pythonProject\mzw.py", line 1487, in <module> # print(guests.index('杨')) # ^^^^^^^^^^^^^^^^^^ # ValueError: '杨' is not in list # 查找指定元素个数 print(guests.count('张')) # 0 print(guests.count('张三丰')) # 1 # 操作列表 # 遍历列表 # 使用range()函数 guests = ['萧峰','杨过','令狐冲','张无忌','郭靖'] for i in range(5): print('尊敬的{}大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会'.format(guests[i])) # 尊敬的萧峰大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 尊敬的杨过大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 尊敬的令狐冲大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 尊敬的张无忌大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 尊敬的郭靖大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 直接的元素遍历 for item in guests: print('尊敬的{}大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会'.format(item)) # 尊敬的萧峰大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 尊敬的杨过大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 尊敬的令狐冲大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 尊敬的张无忌大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 尊敬的郭靖大侠,兹定于九月初九在华山之巅举办新一届的武林大会,诚邀您莅临,共襄盛会 # 例4-2 # 警察抓了A、B、C、D四个偷窃嫌疑犯,其中只有一个人是真正的小偷审问记录如下: # A说:我不是小偷。 # B说:C是小偷。 # C说:小偷肯定是D。 # D说:C在冤枉人。 # 已知四个人中有三个人说的是真话,一个人说的是假话。请问到底谁是小偷? # 这道题跟离散数学上学的一样,把每个分句字符化,判断每个的真值 # 转化为 编程语言,只有三个是真的,那条件可以设为把四个分句的表达式相加判断真值是否为3 suspect = ['A','B','C','D'] for x in suspect: # x表示小偷 if((x != 'A') + (x == 'C') + (x == 'D') + (x != 'D')) == 3: # 小偷不是A,小偷是C,小偷是D,小偷不是D print('小偷是:',x) break # 找到后直接跳出就可以了,就不用再循环了 # 列表排序 # sort() 原地排序,直接修改本身 guests = ["萧峰","杨过","令狐冲","张无忌","郭靖"] guests.sort() print(guests) # ['令狐冲', '张无忌', '杨过', '萧峰', '郭靖'] # 对于中文它既没有按照首字母也没有按照笔画,这里是按照编码值排的 # print(guests.sort()) # None 这里不能直接这样打印出来 guests1 = ['xiaofeng','yangguo','linghuchong','zhangwuji','guojing'] guests1.sort() print(guests1) # ['guojing', 'linghuchong', 'xiaofeng', 'yangguo', 'zhangwuji'] 这是按照首字母排的 guests1.sort(reverse=True) # 降序排列 print(guests1) # ['zhangwuji', 'yangguo', 'xiaofeng', 'linghuchong', 'guojing'] guests1.sort(reverse=False) # 升序排列 print(guests1) # ['guojing', 'linghuchong', 'xiaofeng', 'yangguo', 'zhangwuji'] # sorted 非原地排序,生成副本,不影响原序列 内置函数 print(sorted(guests1,reverse=True)) # 降序排列 # (写法)或者⬇ a = sorted(guests1,reverse=True) # 降序排列 print(a) print(sorted(guests1,reverse=False)) # 升序排列 或者省略reverse=False,表示升序 # 列表切片 # 与前面的字符串的索引和切片一样 guests = ["萧峰","杨过","令狐冲","张无忌","郭靖"] print(guests[1:3]) # ['杨过', '令狐冲'] print(guests[:2]) # ['萧峰', '杨过'] print(guests[:]) # ['萧峰', '杨过', '令狐冲', '张无忌', '郭靖'] 全部输出 print(guests[:-1]) # ['萧峰', '杨过', '令狐冲', '张无忌'] 从开头到-2位置,-1不取 print(guests[1:4:2]) # ['杨过', '张无忌'] 间隔两个 print(guests[::-1]) # ['郭靖', '张无忌', '令狐冲', '杨过', '萧峰'] 逆序 # 列表的扩充 #与字符串的 + 一样 guestsm = ["萧峰","杨过","令狐冲","张无忌","郭靖"] guestsw = ['李秋水','郭襄','赵敏','任盈盈','袁紫衣'] print(guestsm + guestsw) # ['萧峰', '杨过', '令狐冲', '张无忌', '郭靖', '李秋水', '郭襄', '赵敏', '任盈盈', '袁紫衣'] # extend() guestsm.extend(guestsw) print(guestsm) # ['萧峰', '杨过', '令狐冲', '张无忌', '郭靖', '李秋水', '郭襄', '赵敏', '任盈盈', '袁紫衣'] # a = guestsm.extend(guestsw) # print(a) # None 不能这样写 # print(guestsm.extend(guestsw)) # None 不能这样写给直接打印出来 # 重复 与字符串一样 print(guestsm * 2) # ['萧峰', '杨过', '令狐冲', '张无忌', '郭靖', '李秋水', '郭襄', '赵敏', '任盈盈', '袁紫衣', '萧峰', '杨过', '令狐冲', '张无忌', '郭靖', '李秋水', '郭襄', '赵敏', '任盈盈', '袁紫衣']''' # 列表的复制 # copy() 复制之后的生成一个新副本,与之前的列表独立 guests = ["萧峰","杨过","令狐冲","张无忌","郭靖"] print(guests.copy()) # ['萧峰', '杨过', '令狐冲', '张无忌', '郭靖'] # (写法)或者⬇ a = guests.copy() print(a) # ['萧峰', '杨过', '令狐冲', '张无忌', '郭靖'] # 利用切片复制 直接在原来的列表上修改,不独立,两个列表名共享一个列表,最好少用,不用 guestscopy = guests[:] print(guestscopy) # ['萧峰', '杨过', '令狐冲', '张无忌', '郭靖'] # 列表的删除 # 删除指定元素 guests = ["萧峰","杨过","令狐冲","张无忌","郭靖"] del guests[1:3] print(guests) # ['萧峰', '张无忌', '郭靖'] # del guests[3] # 注意这里 若是不把前面第一次删除的注释掉,这里的是在第一次删除删除过后的基础上进行删除 # print(guests) # 而这里的下标3则超出了范围 在这里加以说明 del guests[:] print(guests) # [] 这里是清空列表,不是删除列表 # 删除列表,把这个列表给删除 del guests print(guests) # 会报错说明这个列表已经被删除了,无法打印出来 # print(guests) # ^^^^^^ # NameError: name 'guests' is not defined''' # 数值列表 # 用input()函数输入 # 在输入数的时候要连带[]一起输入 # lnum = eval(input('请输入一个数值列表:')) # print(lnum) # 请输入一个数值列表:[1,4,6,3,7,4,7] # [1, 4, 6, 3, 7, 4, 7] # 用list()函数转换 lnum1 = list(range(1,11)) print(lnum1) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] lnum2 = list(range(2,10,2)) print(lnum2) # [2, 4, 6, 8] # 字符串list函数也可以转换但是有出入,它会把每一个字作为元素 # 等后面在列表和元组转换那点 会讲这个问题怎么解决 ls = list('我爱中国') print(ls) # ['我', '爱', '中', '国'] ls = list('I love China.') print(ls) # 中间的空格也作为元素列出来 # ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'C', 'h', 'i', 'n', 'a', '.'] # 列表的生成式 # 列表 =[循环变量相关表达式 for 循环变量 in range函数] # 循环变量相关表达式 指包含了列表的运算 # for 循环变量 in range函数 指定了循环变量的变化区间和方式 # 总的来说列表生成式是将range()函数生成的若干个数按照指定的表达式运算后的结果作为元素创建了数值列表 # 例-创建一个由1~10这十个数的平方值组成的数值列表 lnum = [i**2 for i in range(1,10+1)] print(lnum) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] # 例-已知有学生信息列表如下 # ls=[['张三",18,江苏南京'],['李四',19,'山东济南']] # 1.请根据该列表用 列表生成式 生成包含学生姓名的列表 # 2.如果需要生成包含学生姓名和籍贯的列表,列表生成式该如何写? # 1. ls=[['张三',18,'江苏南京'],['李四',19,'山东济南']] names = [item[0] for item in ls] print(names) # ['张三', '李四'] # 2. NamePlace = [item[0:3:2] for item in ls] print(NamePlace) # [['张三', '江苏南京'], ['李四', '山东济南']] # 列表生成式是允许嵌套的,其嵌套格式如下: # 列表 =[循环变量相关表达式 for 外循环 for 内循环] # 举例 ls2 = [i*j for i in range(1,3) for j in range(1,5)] print(ls2) # [1, 2, 3, 4, 2, 4, 6, 8] # 等价于⬇ ls3 = [] # 先给个空列表 for i in range(1,3): for j in range(1,5): ls3.append(i*j) # 然后把元素加进去 print(ls3) # [1, 2, 3, 4, 2, 4, 6, 8] # 例-请用列表生成式生成九九乘法表列表并输出 # 首先确定内外循环,外循环作为行(i)9行,然后在考虑列(j) # 九九乘法表 第一行有一个,第二行有两个...第n行有n个 # 解释一下代码 # 循环变量相关表达式 这部分 表达的是 i*j=(i*j) # 因为写在列表里面 要呈现出来需要给它转换为字符串包括*和= # 要给它连接起来 要用到字符串+拼接 # 然后还要考虑 换行的问题,i==j的时候就该换行了,'\n'换行符这个写在if前面,如果不等,那就不换行' ' # 外循环9行,内循环要从1开始,最后是开区间所以是i+1 # 最后再用一个for循环输出来,用的是直接输出,要注意print它会自动换行,所以最后要加end=' ' ls4 = [str(i)+'*'+str(j)+'='+str(i*j)+('\n'if i==j else ' ') for i in range(1,9+1) for j in range(1,i+1)] for item in ls4: print(item,end=' ') # 1*1=1 # 2*1=2 2*2=4 # 3*1=3 3*2=6 3*3=9 # 4*1=4 4*2=8 4*3=12 4*4=16 # 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 # 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 # 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 # 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 # 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 ls4 = [str(i)+'*'+str(j)+'='+str(i*j)+('\n'if i==j else ' ') for i in range(9,0,-1) for j in range(1,i+1)] for item in ls4: print(item,end=' ') # 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 # 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 # 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 # 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 # 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 # 4*1=4 4*2=8 4*3=12 4*4=16 # 3*1=3 3*2=6 3*3=9 # 2*1=2 2*2=4 # 1*1=1
# 数值列表也有max,min,sum函数 # 元组 # 元组是圆括号(),且元组的元素不能修改,除此之外与列表没什么不同 # 所以 有关 增添,删除,排序等涉及改变元素的对元组都不行 # 定义元组 tuple1 = ('成龙','小玉','老爹','特鲁','瓦龙','布莱特','圣主') print(tuple1) tuple1 = '成龙', '小玉', '老爹', '特鲁', '瓦龙', '布莱特', '圣主' # 不带括号用,隔开也可以定义元组 # ('成龙', '小玉', '老爹', '特鲁', '瓦龙', '布莱特', '圣主') tuple2 = ('龙叔',) # 对于单个元素要想它是元组,要在后面加',',否则会识别为字符串 print(tuple2) # ('龙叔',) print(type(tuple2)) # <class 'tuple'> # 元组充当列表元素 lls = [('龙叔','超人'),('小玉','黑影军团')] print(lls[0]) # ('龙叔', '超人') print(lls[0][1]) # 超人 # 若是想把'黑影军团'换成'特工' # 不能lls[1][1] = '特工' 因为元组不能修改 # 但是可以用一个新的元组元素来替换 lls[1] = ('小玉','特工') print(lls[1]) # ('小玉', '特工') # 转换函数 # 元组与列表之间的转换 # 把元组转换成列表 # list() lis1 = list(tuple1) print(lis1) # ['成龙', '小玉', '老爹', '特鲁', '瓦龙', '布莱特', '圣主'] # 把列表转换成元组 # tuple() tup1 = tuple(lis1) print(tup1) # ('成龙', '小玉', '老爹', '特鲁', '瓦龙', '布莱特', '圣主') # 字符串与列表之间的转换 sentence = 'I love China!' # 列表 = 字符串.list(分隔符) # 如果分隔符缺省则默认以空格作为分隔符 sentencelist = sentence.split("") print(sentencelist) # ['I', 'love', 'China!']