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]

 

 

总结:

  1. 对列表进行索引的时候注意边界问题,从首个元素取到n个元素,0可以省略,从n个元素开始取到最后一个元素,可以省略末位索引不写
  2. 列表进行切片的方向由步长的正负决定,步长默认为1省略不写
  3. 为什么在本节中处多次出现 “序列“ 二字,留个思考,下面讲元组的时候,解开答案

 

posted @ 2020-08-06 18:05  萝卜园  阅读(260)  评论(0编辑  收藏  举报