Python入门系列之列表
Python系列的学习请点击:https://www.cnblogs.com/lbyy/category/1820463.html
列表的定义
回顾一下前面的数据类型,列表是个什么东西?
1 then_list = ["我只是一个字符串元素",-122222,(111,222),[],{"key":"value"},6666,{"我是一个集合"}]
上面定义了一个列表,它有7个元素,包含了字符串类型,数字类型,元组类型,列表类型(里面嵌套了一个空列表),集合类型(请仔细观察了,集合与字典的区别!!!)
列表是可以为空的,空列表的定义是一样的操作
1 empty_list = []
列表的基本操作
索引
首先明确列表是一种序列,序列即意味着是有顺序的东西,有顺序的东西,我们就能根据它的位置来找到他再摆布它了,仔细想想初中时代你在教师里是不是有个座位,第几组第几个,来了个新老师老师不知道你的名字,但只需要喊出你的座位号,是不是一样的知道是叫你了。语文老师:第一组第五个同学请你背诵《出师表》……什么不知道?那你这节课就站着听吧
举这个例子是因为,在Python里面,对序列我们也可以根据元素的序号来找到它,这种操作称之为——索引,但是索引位是从0开始的,下面看示例:
then_list = ["我只是一个字符串元素",-122222,(111,222),[],{"key":"value"},6666,{"我是一个集合"}] # 对列表的元素进行索引,并赋值给变量 index_0 = then_list[0] index_1 = then_list[1] # ……省略几个不写了 index_6 = then_list[6] # 打印上面的三个变量 print(index_0)
print(index_1)
print(index_6)
看看运行结果
变量 index_0的取值是列表的0号位元素,对应的结果是字符串 "我只是一个字符串元素",也就是列表的第一个元素,这是因为在python中所有序列的编号都是从 0 开始递增的,第一个元素的索引号是0,第二个元素索引号是1,第n个元素的索引号是 n-1,
所以上面那个列表有七个元素,示例索引最后一个元素,索引号为6,如果将将6改成7会出现怎样的结果呢?
结果我们发现报错了,报什么错呢?IndexError:list index out of range ----> 索引错误:索引出界了
我们的索引范围超出了列表的长度(列表的元素个数),你想想,教室里面明明只坐了50个同学,老师喊道第51个同学站起来,下面的学生该懵逼了,所以我们对列表进行索引的时候一定要注意列表有多少个元素,再去取列表里你要的元素
那么有个问题了,列表里面只有三五个或者十来个我还能数,如果碰到一个列表有几百个元素呢?(毕竟前面也说了列表是不限制长度的!)那么我也一个一个的去数?真要是这样谁还学Python,呸,垃圾!
先解决第一个问题,判断列表的长度,在python里有一个内置函数——len()
1 then_list = ["我只是一个字符串元素",-122222,(111,222),[],{"key":"value"},6666,{"我是一个集合"}] 2 3 length = len(then_list) 4 5 print(length) # 结果为 7
第二个问题,我们会去数元素吗?傻子才那么干,列表本身有个方法函数 —— index()
我们可以用这个方法来根据元素内容,反推元素的索引号,也就是找到这个元素在列表当中第一次出现的位置(元素索引从0开始,所以元素的位置是索引号加1)
then_list = ["我只是一个字符串元素",-122222,(111,222),[],{"key":"value"},6666,{"我是一个集合"},6666] index_num = then_list.index(6666) print(index_num) # 输出的结果是 5 元素在列表中第一次出现位置的索引号为5 即第6个元素
其实索引还阔以从右往左(从后往前)进行,想想你的某一次考试因为打瞌睡一不小心还就睡过头了,然后就挂科了,成绩名列倒数第一回家没法交差了,哦多可?其实一点也不用慌,倒数第一也是第一嘛,回家后直接跟你老爸老妈说,我考了第一名
怕是还有意想不到的奖励哦(#滑唧唧)
ok,那么从最后一个元素往前索引怎么做呢?正负之分嘛,倒数第一和负数第一可有区别?(反正我觉得没区别)所以要取最后一个元素(右边第一个)
then_list = ["我只是一个字符串元素",-122222,(111,222),[],{"key":"value"},6666,{"我是一个集合"}] index_r1 = then_list[-1] print(index_r1) # 结果就是取到最后一个元素 {'我是一个集合'}
至于为什么不是 -0 我想你心里应该有点那啥
切片
What???你在讲什么哦?你是要把列表切成片吗?宾果,答对了,心里默默的夸自己十万遍(#滑稽)
使用索引我们访问的只是单个元素,但是当我们有个业务场景需要访问一个特定范围内的元素的时候,就可以用到切片,既然也说了是取一个范围内的元素,那么肯定就有起始和结束两个值,比如说,统计班上考试总分前十名的的同学,从一开始到第十名结束。
同理,对列表进行切片操作就是通过列表内两个元素的索引号,中间用英文的冒号 : 隔开来取到这个范围内的所有元素
解释下上面的示例:创建了一个列表,赋值给变量 list_1,然后第一次打印输出0号位置到第3号位置之间的元素,第二次结果是一样的,只是一种不同的表达式而已,如果我们是要取某个位置前面的所有元素,就可以这样简写
至于,这里我为什么要用这两种方式来示例呢?因为你可能会疑惑,[0:3] 不应该是输出索引号为 0,1,2,3的4个元素吗?不知道你还是否记得高中数学里面的开区间前包后不包? 只是数学里面的表达式是 ---> [a,b) 这样的,Python里面为什么不是这样表示我也不晓得
我同时示例了两种方法,是觉得第二个方法看起来可能会更好理解,[ : 3] 可以理解成取前三个元素,前三个不就是1,2,3嘛。
所以上面的列表,你要取第二个到第六个元素(包含第六个元素本身)应该这样:
1 list_1 = [1,2,3,4,5,6,'a','b','c'] 2 get_2_6_range_val = list_1[2:7] # 要取第六个元素 因为前包后不包 所以起始位置是2 结束位置应该7 3 print(get_2_6_range_val) # 结果是输出 [3,4,5,6,'a']
切片的进阶操作:我现在只想取列表内的所有偶数
首先我们分析这个列表,有三个偶数数字分别是索引号是1的元素 2,索引号是3的元素 4,索引号是5的元素 6,要取到这三个偶数,而不取它们中间包含的奇数3和5,这是要隔山打牛啊!
其实方法是一样的,我们要取得范围确定好 [1:6] 但是这样也会把不要的东西拿出来,解决办法就是跳开它们1号到3号到5号刚好都是间隔2,所以我们这样做,给它加个条件,隔2个位置切一刀
1 list_1 = [1,2,3,4,5,6,'a','b','c'] 2 # 索引号为1与索引号为6之间的元素每隔2个步长取一次 3 print(list_1[1:6:2]) # 结果是输出了我们想要的 [2,4,6]
同索引可以反着取一样,切片也可以反着切(一根黄瓜你从这头切难道不可以从那头切?)切片时索引号是0可以被省略不写
从右往左切片,起始位至索引号是大于末尾索引号的
但是请注意!!!虽然都拿到了只包含偶数的列表,可他们不相等,序列是有方向的,
列表是可变的,可以增加元素、追加元素、删除元素、修改元素的值,增加和追加的区别就是:增加是在列表内指定任意位置新增一个元素,追加是在列表末尾新增一个元素
append函数
要给列表追加一个元素,使用方法append(obj),obj对象会被追加在列表的末尾,obj可以是六大类型的任意一个(数字,元组,字典,字符串……)
insert函数
insert是插入的意思,可以使用这个函数在列表内的指定位置插入一个元素,函数接收两个参数,第一个参数是要插入位置的索引号,第二个参数是插入的对象——insert(index,obj)
del函数、pop函数、remove函数
这里介绍三种方法来删除列表里的元素,三者有着各自的特性,他们的区别在哪,下面会详细介绍
del:删除列表指定位置或范围的元素(根据索引号)
1 lst = ['a','b','c','d','e','f','g'] # 定义一个列表lst 2 del lst[1] # 删除列表lst中索引号为1的元素 3 print(lst) # 输出结果 4 # ['a','c','d','e','f','g'] 元素 字符串“b” 被删除了
5 del lst[:3] # 删除列表前三个元素
del:可以用来删除整个列表对象
lst = ['a','b','c','d','e','f','g'] # 定义一个列表lst del lst # 删除列表lst
pop:删除指定位置元素或最后一个元素(默认),并返回这个被删除的元素
lst = [1,2,3,4,5,6] # 定义一个列表lst lst.pop(0) # 删除索引号是0的元素,并返回被删除的元素 1 lst.pop() # 不指定位置,会默认删除列表最后一个元素,并返回被删除的元素 6
remove:按照元素值删除,删除第一个匹配到的元素(如果列表存在多个一样的元素)
lst = [1,2,1,3,4,5,6] # 定义列表lst lst.remove(1) # 删除元素值1 print(lst) # 打印输出lst [2,1,3,4,5,6]
修改列表里面的元素可以先找到这个元素然后直接赋值
1 lst = [1,2,3,4] 2 lst[0] = 6 # 将列表的第一个元素改成数字6
列表的拼接与排序
列表拼接就是将多个列表拼接成一个新的列表,列表也是可以进行加法运算的哦!
咦?是不是感觉和上面的append方法一样?No,你错了!
你看,一样吗?明显不一样嘛!!!而且第一个示例 列表a+列表b 会隐式地创建了一个新列表,原来的a和b都没有改变,而append改变了列表a
extend函数
然后这里呢还介绍一个函数——extend(),让你的代码优雅一点(呸,我就喜欢用 + 号),这个函数的作用就是将可迭代的对象追加到列表后面,且会将对象进行解包后再追加
这里引入了两个新的概念什么是可迭代对象?什么是解包?这里暂时不说得太详细,你目前只要记住我上面示例的那些都是可迭代对象(Python六大数据类型除了数字不是可迭代的其余都是)
解包就是将可迭代对象里面的元素进行拆分,有多少个就拆分多少次
1 this_tuple = (1,2) # 定义一个元组 this_tuple 2 x,y = this_tuple # 将元组解包 3 4 this_str = "今天星期四" # 定义一个字符串 5 a,b,c,d,e = this_str # 解包字符串 6 # 打印输出结果 7 print(x) # 1 8 print(y) # 2 9 print(a) # '今' 10 print(b) # '天' 11 # …… 省略后面的
这样写得目的是为了再次申明,解包对象,有多少个元素就会拆分多少成个,同时去定义变量接收这些被拆解的元素时,也要是相应的数量
在ide中的话你可以写得更轻松(交互式环境只支持上面那种写法,ε=(´ο`*)))唉~那样写是真的 累!)
1 this_tuple = (1,2,3) # 定义元组 2 print(*this_tuple) # 得到结果 1 2 3
sort函数
对列表按指定规则(默认升序)排序,使用语法:list.sort( key=None, reverse=False),函数接收两个参数,参数key接收一个函数(后续详解,感觉篇幅有点长了),reverse接收一个布尔值(False:升序,True:降序)
但是因为都有默认值,可以都不传值,直接调用 sort()
1 a = [3,2,1] 2 a.sort() # 默认排序规则为 升序 3 print(a) # 得到结果 [1,2,3] 4 b = [1,2,3] 5 b.sort(reverse=True) # 降序排列 6 print(b) # [3,2,1]
总结:
- 对列表进行索引的时候注意边界问题,从首个元素取到n个元素,0可以省略,从n个元素开始取到最后一个元素,可以省略末位索引不写
- 列表进行切片的方向由步长的正负决定,步长默认为1省略不写
- 为什么在本节中处多次出现 “序列“ 二字,留个思考,下面讲元组的时候,解开答案