python基础梳理(五)容器类型之列表list

在说列表之前,说一下Python中的有哪些序列:
字符串 str 元组 tuple
列表 list 字节串 bytes
字节数组 bytearray
这些序列都有一个共同点那就是有序的,和之前说的字符串的有着相同的使用规则。

一、列表 list基本概念
定义:由一系列元素组成的,元素与元素之间可能没有任何的关系,但他们之间有先后顺序关系
列表是一种序列,是一种能存储任何类型的容器,是一种可以被改变的序列(区别于字符串,字符串一旦生成不能被改变,在c中称常量字符串)

列表的构造函数:
list():构造一个空的列表
list(iterable):用可迭代对象构造一个列表,如字符串等
实例:
list(“hello”)
[‘h’,‘e’,‘l’,‘l’,‘o’]
list(range(1,6,2))
[1,3,5]

1.元素间可能没关系:
实例:
L1 = [ ] #L绑定了一个空的列表
L2 = [ 1,2,3,4,5]
L3 = [ 1,2,3,4,5]
L4 = [ 1,‘hello’,3,4,5] #可以储存任意类型,元素间可能没什么关系
L 5= [ 1,2,[3.1,3.2,3.3],4,5] #可以储存任意类型,当然可以是列表类型

函数len():可以对所有的容器有效 len(L5) = [3.1,3.2,3.3]是被当做一个元素处理的

2.列表的运算以及列表的有序性
运算符:* *+ += ** *= **

加号:与字符串中一样,用于拼接,这里是拼接列表
x = [1,2,3] y = [4,5,6]
m = x + y [1,2,3,4,5,6] #相加前后顺序不变
n = y + x [4,5,6,1,2,3]
加等号:给左边的列表加上右边的列表,使得左边列表变量绑定新的列表,同字符串
x = [1,2,3]
x += [4,5,6]
x------------>[1,2,3,4,5,6]
乘号:生成一个新的重复的列表
y = [1,2]
x = y* 3 x = [1,2,1,2,1,2]
乘等号:生成重复的列表,给原来的那个列表绑定*
x= [1,2]
x *=3 x = [1,2,1,2,1,2]

3.列表比较大小
< <= > >= == !=
[1,2,3] > [1,2] True
[1,3] > [1,2,4] True
[,3] > [3.0] False
[“ABC”,123] > [“abc”,123] False
比较规则和字符串的比较规则一样,挨个比较,遇到大的即为大
几个易错实例:
[1,“two”] > [“two”,1] erro 比较时1和two类型分别是int 和 str,语法错误
[1] < [‘2’ ] erro 同理 类型不同不能比较
[1] > [0.4] True

练习题:
输入一些文字,将文字保存在列表中,当输入空格的时候结束输入,并打印列表L中的内容
在这里插入图片描述

二、列表的in / not in运算符:
in:用来判断一个对象是否在容器中,在返回True,否则返回False
原理:即拿对象依次和容器中的数据进行 == 运算
在这里插入图片描述
注意点:在c语言中我们就知道由于float的数据的特殊性,我们比较俩个浮点型数时不用 == 或者 !=,比如浮点数a b
abs(a-b ) < 0.0000001 即俩个数的插值的绝对值小于它

三、列表的索引
语法: 列表[整数表达式]
使用:与字符串的索引一样,可以正向索引,反向索引,唯一不同的是,字符串是不可修改的,而列表可以修改,所以我们通常使用索引修改增加列表中的元素
示例:使用索引修改列表的值
在这里插入图片描述
四、列表的切片
语法:和字符串一致
列表[:]: 列表[start:end]
列表[::]: 列表[start?step]
statr:表示’下刀‘的地方,end表示收刀的地方
在这里插入图片描述
上面我们说过,字符串是不可修改的,所以我也也就能用切片拿出来看看是个什么东。但是列表属于可以修改的序列,我们可以切取列表中的一部分内容,用其他的东西替换等,来修改列表(就像c语言中的数组一样,;利用下标修改数组)。

切片的示例:
在这里插入图片描述
如果我们需要给列表后面加上数据:可以灵活使用以下俩种方法
在这里插入图片描述
还有其他的方法,比如我们之后要讲到的extend()方法,insert()方法等

一个切片的错误使用案例:
在这里插入图片描述
[::2]将列表L切成三段,而我们的可迭代对象是五个字符,所以没法分,正确的应该是每个切片又对应的数据:
在这里插入图片描述
讲一个字符串切片的误区:有人会认为下面的代码修改了字符串
在这里插入图片描述
刚开始可能会认为字符串a最终被修改成了hellopython,实际上并没有,原来的数据并没有别修改,而是最终新生成了一个新的字符串hellopython然后给a绑定上了,原来的hello还在,没被修改。

五、del语句
作用:用于删除列表中的元素
语法:del 序列[整数表达式]
del 序列[切片]
示例:
在这里插入图片描述

六、一些函数
python3中常用于序列的函数:
len(seq)
max(seq)
min(seq)
sum(seq):求序列中所有元素的和(元素必须为数值类型)
any(seq):真值测试,只要序列seq中有一个为真,就返回True
all(seq):真值测试,需要所有的元素都为真才返回True

常看list的常用方法:help(list)
L.index(val,begine,end):返回元素val的索引,当v不存在时,出发ValueErro
L.insert(index,obj):将obj插入到列表下标为index之前的位置(前插)
L.count(x):返回列表中元素x的个数
L.remove(x):从列表中删除第一次出现列表中的值
L.copy():复制此列表,只复制表面引用关系,真实的数据并不复制(浅拷贝),引用同一块内存的数据
L.append(x):向列表追加单个元素(末尾插入)
L.extend(list):向列表的末尾追加一个列表
L.clear():清空列表,相当于L[:] =[]
L.sort(reverse = False):将列表的元素进行排序,要求元素为同一类型,默认为从小到大排,当reverse = True为从大到小排列
L.reverse():列表的反转,用来改变原列表的先后顺序
L.pop(index):将对应下标的数据剔除出列表,如果不给参数,默认从尾部删除,同时返回删除元素的引用关系(a = L.pop(1),可以用一个数据接收)

七、浅拷贝与深拷贝:
浅拷贝:只复制表面变量,不会复制内存中变量真正绑定的数据,如果被多次修改,值为最后一次修改后的结果
深拷贝:我们一般只对可修改的对象进行深拷贝,对不可修改的如字符串我们只进行浅拷贝,只需要能读取就可以(就像ELF文件中.rodata,在c语言中又字符串常量,我们只读不能修改)

示例:
L1 = [1.1,2.2,3.4.[3.1,3.6]]
import copy
L2 = copy.deepcopy(L1)
这样L2会拥有和L1一样的一份内存数据

另外,我们可以这样修改L1中3.1的值:
在这里插入图片描述

八、列表和字符串比较:
1.列表和字符串都是序列,元素之间又先后顺序
2.字符串是不可变的序列,而列表是可变的序列
3.字符串中每个元素只能存储字符,而列表可以存储任意类型的元素
4.列表和字符串都是可迭代对象

九、利用列表存放分割的字符串 split和join

s.split(sep =None):j将字符串使用sep作为分隔符来分割字符串s,返回分割后的字符串列表,当不给定参数时,默认使用空白字符(space \n \r)来作为分割,sep将不作为生成列表的一部分
示例:
在这里插入图片描述

s.join(iterable):用可选迭代对象中的字符串,返回一个中间用s进行分隔的字符串
示例:
在这里插入图片描述

十、列表推导式:
作用:利用可迭代对象依次生成带多个元素的列表的表达式,简易的去生成一个列表
语法:
[表达式 for 变量 in 可迭代对象] 或者
[表达式 for 变量 in 可迭代对象 if 真值表达式]

列表的推导式是怎么运行的呢:
在这里插入图片描述
只有当if为真时才会去执行前面的表达式

示例1:生成[1,4,9,16…81]这样的序列
方法1:传统方法
在这里插入图片描述
方法2:使用推导式
在这里插入图片描述
示例2:利用推导式生成1-100内奇数的列表
在这里插入图片描述在这里插入图片描述

列表推导式的嵌套形式:
[表达式1 for 变量1 in 可迭代对象1 if 真值表达式1 for 变量2 in 可迭代对象2 if 真值表达式2]

与其说是推导式嵌套不如说是for的嵌套:

for 变量1 in 可迭代对象1:
for 变量2 in 可迭代对象2:

示例:请用列表的推导式来生成 [A1,A2,A3,B1,B2,B3,C1,C2,C3] 这样的
在这里插入图片描述
十一、几个易错的点
1.在这里插入图片描述

2.切片复制要注意的点:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值