
矿 仔
2022/12/21阅读:26主题:默认主题
Python三:列表
列表
列表可以存储一组元素,按照一定的顺序排列的元素组成。有点类似于Java中的数组,但是对元素不限制必须是相同的类型。
如:动物列表
animals = ['dog','cat','pig']
用方括号表示列表,元素之间用逗号分隔。打印的时候方括号也会跟着一起打印出来。

再比如包含不同类型的元素列表,用户信息
user_info = ['mine',18,188]

事实这个例子不太贴切,用户信息用字典来表示更好一些,这里只是为了说明可以存储不同类型的元素。
访问元素
列表是有序的集合,访问列表的元素只需要把元素的位置(即索引,index)告诉Python即可,比如
first_element = animals[0]

animals[0]代表的意思是取列表animals中索引位置是0的元素(即列表的第一个元素)。这主要是由于在Python中,第一个列表的索引是0而不是1,事实上大多数的编程语言都采用了这种定义。
如此定义的原因在于,不论是列表还是字典,这些数据结构存储的元素最终都是要分布在内存中,比如说现在存储10个元素的列表,每个元素是4个字节。那么它在内存中的分布大概如下
假设初始内存地址1000

在我们需要访问列表中数据的时候,最终计算机会通过地址去访问内存中的数据。**索引或者说是下标,实际上代表的也是偏移量(offset)**。
比如arr[0]的元素应该是落在1000-1003的内存地址中,arr[1]的元素是落在1004-1007的内存地址中,索引从0开始的计算机的寻址公式是:
a[i]_address = base_address + i * data_type_size
如果索引是从1开始的,那么计算公式为:
a[i]_address = base_address + (i-1)*type_size
相比于0开始,只是多了一个i-1的步骤,对于CPU来说就是一次减法指令,不要小看这一小步,对于列表这种底层数据结构来说,会尽可能的让性能最优的。
Python为访问列表最后一个元素提供了特殊的语法,即指定索引为-1。
last_element = animals[-1]

这种负数索引也适用于倒数第二个元素(-2,倒数第三个元素(-3)用法。
可以使用列表中的值,直接打印或者用变量关联都可。
操作列表中元素
首先是修改列表的元素,直接修改对应索引位置的元素即可,如下
修改索引位置是0的元素
animals[0] = 'duck'
打印看下效果

可以看到已经从dog变成了duck。
接着添加元素,有几种添加元素的方式:
方式一、在列表末尾添加元素
这里主要利用到一个append方法,具体用法是
列表.append(要添加的元素)
演示一下:
animals.append('tiger')
看下效果:

可以看出添加成功了。
方式二、在任意位置插入元素
主要利用insert方法,接收两个参数,一个是索引位置即要将元素插在哪里,一个是要插入的元素,具体用法如下:
animals.insert(2,'lion')
我在索引位置2处插入一个lion,看下效果:

可以看出插入成功了,并且这个原来这个位置及之后的元素都右移一位。
解下来是删除元素,也有几种方式可以删除
方式一、del语句可以删除任意位置的元素,并且删除以后就不能再访问这个删除的元素了,具体用法
del 列表[索引]
比如删除animals中第三个元素(即索引为2)
del animals[2]

之前插入的lion元素已经被删除了。
方式二、使用pop方法删除元素
这种方式删除的元素还可以继续利用,pop的意思是弹出,可以理解从列表中弹出来,有点类似数据结构中的栈。pop弹出列表末尾的元素,这也有点类似于弹出栈顶的元素。栈的特性后入先出。

这里弹出了末尾的元素,并且用变量进行了接收,后面可以利用这个弹出的元素。
还可以指定位置弹出元素。比如指定弹出索引是0的元素

方式三、根据值删除元素
有时候并不知道值的位置,可以根据元素的值删除,通过使用remove方法。看下animals列表,还剩两个元素cat和pig。

演示根据元素cat的值去删除该元素
deleted_element = animals.remove('cat')
方法remove只会删除第一个指定的值,如果满足条件的值有多个,需要利用循环来保证每个值都删除。
列表排序
排序这一功能很常见,sort方法可以对列表中元素永久性的排序。使用方法:列表.sort()
定义一个cars的列表,里面的元素是一些品牌的汽车,如下
cars = ['bwm','audi','volvo','toyota']

排序:
cars.sort()

sort方法也可以通过传递参数reverse来指定排序的方式,默认是正序也可以不传,如上面示例那样。也可以通过传入reverse=True来进行倒序排列。
cars.sort(reverse=True)

这种通过sort方式对列表元素修改的顺序是永久性的,也就是在不进行其他的操作前,会保持修改的样子。
还有一种方式可以保留列表原来的排列方式,又可以以特定的顺序呈现他们,这就是函数sorted(),也就是改变的顺序只是暂时的。
重新定义cars列表,如下:
cars = ['bwm','audi','volvo','toyota']
临时改变顺序
print(sorted)

其实也可以用变量接收,来破坏这种约束性。
sorted函数也支持传入reverse参数的方式,用法与sort相同。
若想将列表中的元素全部反转,可利用reverse()方法。依然是cars列表,进行反转。

这种对元素的修改也是永久性的。想要变回最初的排列方式可以再调用一次reverse()方法。
可以通过len()方法确定列表的长度。用法将列表传入到len()方法内。

索引错误
访问列表不存在元素的索引时将引发错误,比如cars列表中只有四个元素,那么它的索引为0-3,这时如果访问索引4的话将会报错,因为找不到元素,这在其他语言中可能是索引越界。
如下:

Python提供了负数索引的方式从后往前访问元素,比如-1代表最后一个元素,-2代表倒数第二个元素等,这里要访问最后一个元素就是cars[-1]

但是有一种情况这种方式也会报错,就是列表是空的时候。如定义个空列表
arr = []
再通过这种方式访问。

参考
《Python编程:从入门到实践》 埃里克·马瑟斯著
作者介绍
