【AI编程学习之Python】第十天:Python的列表
发布者:admin发表于:27天前阅读数:133评论:0
关键词:pythonai

python_AI

列表:用于存储任意数目、任意类型的数据集合。

列表是内置可变序列,是包含多个元素的有序连续的内存空间。列表定义的标准语法格式:

>>>a=[10,20,30,40]

其中,10,20,30,40这些称为:列表a的元素。

列表中的元素可以各不相同,可以是任意类型。比如:

a=[10,20,’abc’,True]

列表对象的常用方法汇总如下,方便大家学习和查阅。

方法说明结果
list.append(x)增加元素将元素增加到list尾部
list.extend(aList)增加元素将列表alist的所有元素增加到list尾部
list.insert(index,x)增加元素在列表指定index位置插入元素
list.remove(x)删除元素删除首次出现的指定元素
list.pop([index])删除元素删除并返回列表,指定index处为止的元素,默认是最后一个
list.clear()删除元素删除所有元素
list.index(x)访问元素返回指定index处的元素
list.count(x)访问元素返回x出现的次数
len(list)访问元素统计元素个数
list.reverse()反转列表所有元素反转
reversed(list)内置函数,不对原列表做修改,返回一个逆序排列的迭代器对象,遍历完就空了
list.sort()排序所有元素排序,默认升序,加reverse=True 降序
sorted(list)排序内置函数,排序
list.copy()浅拷贝返回对象浅拷贝
random.shuffle(list)打乱排序import random
max(list)返回最大值
min(list)返回最小值

python列表大小可变,随时增加或缩小

字符串和列表都是序列类型,一个字符串是一个字符序列,一个列表是任何元素的序列。我们前面学习的很多字符串的方法,在列表中也有类似的用法,几乎一模一样。

基本语法创建

>>>a=[10,20,'sxw']>>>a=[]

list ()创建

使用ist0可以将任何可迭代的数据转化成列表。

>>>a=list()>>>a=list(range(10))>>>a=list("sss","ddd")

range()创建整数列表

range0可以帮助我们非常方便的创建整数列表,这在开发中及其有用。语法格式为:

range([start,]end [,step])

start参数:可选,表示起始数字。默认是0

end参数:必选,表示结尾数字。

step参数:可选,表示步长,默认为1

python3中range()返回的是一个range对像,而不是列表。我们需要通过list()方法将其转换成列表对象。

>>>list(range(3,15,2))[3,5,7,9,11,13]

推导式生成列表

使用列表推导式可以非常方便的创建列表,在开发中经常使用。但是,由于涉及到for循环和if语句。在此,仅做基本介绍。在我们控制语句后面,会详细讲解更多列表推导式的细节。

>>>a=[x*2 for x in range(5)] // 循环创建多个元素>>>a=[x*2 for x in range(5) if x%9==9] // 循环创建多个元素 加过滤条件

列表元素的增加和删除

当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这个特点涉及列表元素的大量移动,效率较低。除非必要,我们一股只在列表的尾部添加元素或删除元素,这会大大提高列表的操作效率。

append()方法 **

原地修改列表对象,是真正的列表尾部添加新的元素,速度最快,推荐使用。

>>>a=[20,40]>>>a.append(80)

+运算符操作

并不是真正的尾部添加元素,而是创建新的列表对象:将原列表的元素和新列表的元素依次复制到新的列表对象中。这样会涉及大量的复制操作,对于操作大量元素不建议使用。

>>>a=[20,40]>>>a=a+[50]

extend()方法 **

将目标列表的所有元素添到本列表的尾部,属于原地操作,不创建新的列表对象。

>>>a=[20,40]>>>a.extend([50])

insert()插入元素

使用insert()方法可以将制定元素插入到列表对象的任意制定位置。这样会让插入位置后面所有的元素进行移动,影响处理速度。涉及大量元素时,尽量避免使用。类似发生这种移动的函数还有:remove()、pop()、del(),它们在删除非尾部元素时也会发生操作位置后面元素的移动。

>>>a=[20,40,60]>>>a.insert(2,80)[20,40,80,60]

del删除

删除指定位置的元素

>>>a=[10,20,30]>>>del a[1]

pop()方法

pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素

>>>a=[10,20,30,40]>>>a.pop()40>>>a[10,20,30]>>>a.pop(1)20

remove方法

删除首次出现的指定元素,若不存在该元素则抛出异常

>>>a=[10,20,30,40,50,20,30,20]>>>a.remove(20)>>>a[10,30,40,50,20,30,20] 第一个20被删除>>>a.remove(100)异常

列表元素访问和计数

通过索引直接访问元素

我们可以通过索引直接访问元素。索引的区间在[0,列表长度-1]这个范围。超过这个范围则会抛出异常。

>>>a=[10,20,30,40,50,20,30,20]>>>a[0]10>>>a[100]异常

index()获得指定元素在列表中首次出现的索引

index0可以获取指定元素首次出现的索引位置。语法是:index(value,[start],[end])。其中,start和end指定了搜索的范围。

>>>a=[10,20,30,40,50,20,30,20]>>>a.index(10)0>>>a.index(20,2)5

count获得指定元素在列表中的出现次数

>>>a=[10,20,30,40,50,20,30,20]>>>a.count(20)3

len()返回列表长度

>>>a=[10,20,30,40,50,20,30,20]>>>len(a)8

成员资格判断in, not in

判断列表中是否存在指定的元素,我们可以使用count()方法,返回0则表示不存在,返回大于0则表示存在。但是,一般我们会使用更加简洁的in关键字来判断,直接返回True或False。

>>>a=[10,20,30,40,50,20,30,20]>>>20 in aTrue>>>100 not in aTrue

切片操作

我们在前面学习字符串时,学习过字符串的切片操作,对于列表的切片操作和字符串类似。切片是Python序列及其重要的操作,适用于列表、元组、字符串等等。切片的格式如下:

切片slice操作可以让我们快速提取子列表或修改。标准格式为:

[起始偏移量 start: 终止偏移量end [:步长step]]

注:当步长省略时顺便可以省略第二个冒号

典型操作(三个量为正数的情况)如下:

操作示例结果
[:] 提取整个列表[10,20,30][:][10,20,30]
[start:] 从start索引开始到结尾[10,20,30][1:][20,30]
[:end] 从开头开始知道end-1[10,20,30][:2][10,20]
[start:end] 从start到end-1[10,20,30][1:3][20,30]
[start:end\:step] 从start提取到end-1,步长是step[10,20,30][1:6:2][20,40,60]

其他操作(三个量为负数)的情况:

操作示例结果
倒数3个[10,20,30,40,50,60,70][-3:][50,60,70]
倒数第五个到倒数第三个(包头不包尾)[10,20,30,40,50,60,70][-5:-3][30,40]
步长为负,从右到左反向提取[10,20,30,40,50,60,70][::-1][70,60,50,40,30,20,10]

切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始偏移量小于0则会当做0,终止偏移量大于“长度-1”会被当成-1。例如:

>>>[10,20,30,40][1:30][20,30,40]

输出正常结果,没有报错

列表遍历

for obj in listObj: print(obj)

列表排序

修改原列表,不建新列表的排序

>>>a=[20,10,30,40]>>>id(a)46017816>>>a.sort() #默认是升序排列>>>a[10,20,30,40]>>>a.sort(reverse=True) #降序排列>>>a[40,30,20,10]>>>import random>>>random.shuffle(a) #打乱顺序>>>a[20,10,30,40]>>>id(a)46017816

建立新表,排序

我们也可以通过内置函数sorted()进行排序,这个方法返回新列表,不对原列表做修改。

>>>a=[20,10,30,40]>>>id(a)46017816>>>b=sorted(a) #默认升序>>>b[10,20,30,40]>>>id(b)46084612>>>c=sorted(b,reverse=True) #降序>>>c[40,30,20,10]>>>id(c)45123188

通过上面操作,我们可以看出,生成的列表对象b和C都是完全新的列表对象。

reversed()返回迭代器

内置函数reversed()也支持进行逆序排列,与列表对象reverse()方法不同的是,内置函数reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。

>>>a=[20,10,30,40]>>>c=reversed(a)>>>c<list_reverseiterator object at 0x0000027B189EB850>>>>list(c)[40,30,20,10]>>>list(c)[]

我们打印输出c发现提示是:list_reverseiterator。也就是一个迭代对象。同时,我们使用list(c)进行输出,发现只能使用一次。第一次输出了元素,第二次为空。那是因为迭代对象在第一次时已经遍历结束了,第二次不能再使用。

列表相关的其他内置函数汇总

max和min

用于返回列表中最大和最小值

>>>a=[3,10,20,15,9]>>>max(a)20>>>min(a)3

sum

对数值型列表的所有元素进行求和操作,对非数值型列表运算则会报错。

>>>a=[3,10,20,15,9]>>>sum(a)>>>57

多维列表

一维列表可以帮助我们存储一维、线性的数据。

二维列表可以帮助我们存储二维、表格的数据。例如下表的数据:

姓名年龄薪资城市
张三1830000北京
李四1920000上海
赵五2010000深圳
a=[ ["张三",18,30000,"北京"], ["李四",19,20000,"上海"], ["赵五",20,10000,"深圳"]]//遍历输出for i in range(len(a)): for j in range(len(i)): print(a[i][j],end="\t") #\t 打完换行