上一篇笔者罗列了python所有的数据类型,其中就有列表LIst,这章具体来看下列表的一些内置方法和用处。
用[]表示,中间以,隔开,元素类型可以不同。
可以进行切片动作,可以用运算符“+”连接列表。
内部元素是可变的,所以称为可变数据类型(variable)。
列表占用一块可以存放多个值的连续的内存空间,对于内存占用较为浪费。
首先,笔者先扩展一个知识点,列表推导式(又称列表解析式)。
什么是列表推导式,简单的说就是用一行简单的表达式直接得到一个有值的列表。适合较简单的逻辑场景,性能高于列表,如果过于复杂的逻辑,就还是用多行表达式进行吧。
扩展: 还有生成器表达式,字典推导式。
举例:
得到1-100的所有数字
正常需要如下:
a = []
for i in range(1,101):
a.append(i)
print(a)
而列表推导式只需:
a = [i for i in range(1,101)]
print(a)
如果是取1-100内的偶数
a = [i for i in range(1,101) if i%2==0]
是不是方便很多,能帮读者解决很多简单的逻辑推导,这里只需了解即可。
言归正传,一个列表内会有很多值,那如果只需要里面的某个值或者某些值要怎么办呢?这里就会用到切片。
切片,对厨师而言,就是把整块肉切成一片一片,这里的切片就是把列表切出我们想要的元素。
语法: list[(开始索引b):(结束索引e):(步长s)] 注:()内可以省略。
lst = [1,2,3,4,5,6,7,8]
想取出里面的4,怎么办?
getlst = lst[3] #单索引取值,索引从0开始计算,即索引0代表第一位元素。
print(getlst)
想取出里面的3,4,5,怎么办?
getlst = lst[2:5] #切片规则:左闭右开,取头不取尾,所以是从索引2到索引5,实际取得是索引2,3,4的值,5不取。
想取出里面的2,4,6,8,怎么办?
getlst = lst[1::2] # 从索引1开始取值,如果结束索引不填,则到底,步长取2,即取值间隔为2.
想取出里面的7,5.怎么办?
getlst = lst[6:3:-2] # 也可以getlst = lst[-2:-5:-2],索引可以为负数,即从后往前算,后第一位为-1.
把列表中的元素反过来排序,怎么办?
getlst = lst[::-1] # 步长为负数即获取的数从后往前获取。
列表切片只能取一些有规律的索引值,如果要取里面的3,6,7怎么办?
那只能使用遍历取跑整个列表的值。
语法:list[(开始索引b):(结束索引e):(步长s)] = iteratable
可迭代对象iteratable,有文件对象,字符串对象,列表对象。。。等等
当起始索引和结尾索引是一样的时候,表示在该索引所在位置之后插入可迭代对象中的所有元素到该列表中。
lst = [1,2,3,4,5,6,7,8]
lst[3:3] = [4,5,6]
print(lst)
当起始索引和结尾索引不一样时,就是有替换的功能。
lst[::2] = [x for x in range(1,5)]
可迭代对象的值总数只能等于被赋值对象,否则报错如下:
ValueError: attempt to assign sequence of size 6 to extended slice of size 4
如何看类的内置方法,dir(list)
在列表尾部插入新元素,新元素必须为可迭代对象。
lst = [1,2,3,4,5,6,7,8]
lst.extend([4,5])
print(lst)
lst.extend(4)
报错:TypeError: ‘int‘ object is not iterable
在列表尾部插入新元素,大多数类型的值都行。
lst = [1,2,3,4,5,6,7,8]
lst.append([4,5])
print(lst)
与extend比较是不是看出了区别,append会原封不动的把值插入列表,extend则按照可迭代对象内的元素类型插入。
lst.append(4)
支持不可迭代对象插入。
根据索引插入新元素,大多数类型的值都行。
lst = [1,2,3,4,5,6,7,8]
lst.insert(1,"hello")
print(lst)
在索引1位置插入新元素,后续旧元素往后推。
根据索引删除元素,默认删除最后一位(不填索引值)
lst = [1,2,3,4,5,6,7,8]
lst.pop(2)
print(lst)
直接根据需要删除的元素去列表内删除第一个匹配的项。
lst = [1,2,3,4,2,2,7,8]
lst.remove(2)
print(lst)
只是把第一个2删除,后面的2并未删除。
要全部删除需要遍历:
a = 1
lst = [1,2,3,4,2,2,7,8]
while a:
try:
lst.remove(2)
except ValueError:
a = 0
print(lst)
还有更简单的方法,读者可自行研究。
删除列表内的所有元素,变为空列表
lst = [1,2,3,4,2,2,7,8]
lst.clear()
print(lst)
删除列表索引切片的值。
lst = [1,2,3,4,2,2,7,8]
del lst[2:4]
print(lst)
通过具体的值查询在列表中的位置,第一个匹配的位置。
lst = [1,2,3,4,2,2,7,8]
a = lst.index(2) # 返回索引值
print(a)
copy()方法: 复制列表
sort()方法: 列表排序,默认正序reverse=False
count()方法: 计算列表内某元素的数量
A: list.sort(reverse=False) # 无返回值 ; list = sorted(list,reverse=False) # 有返回值
[0,2,4,8,8,9,-2,-4,-4,-5,-20],正数从小到大,负数从大到小
A: a = sorted(foo,key=lambda x:(x<0,abs(x)))
A: 使用冒泡排序
A: a = [j for i in [[1,2],[3,4],[5,6]] for j in i]
原文:https://www.cnblogs.com/yingzidy/p/12335853.html