一、列表的简介
列表是包含0个或多个对象引用的有序序列,由于列表中所有数据项实际上都是对对象的引用,所以列表内可以存放任意数据类型的数据项,比如列表与元组。与元组不同的是,列表是可变的,我们可以很容易的对列表中的项进行删除或替换、删除。
二、列表的创建
空列表可使用中括号[]来创建,也可以使用list()函数进行创建。
非空列表的创建:一是可以使用中括号[]包含一个或多个用逗号分隔的数据项来创建;二是使用list()函数进行创建,list()函数只接受一个参数,所以可以提供一个由()包括的一个或多个用逗号分隔的数据项做为一个参数传递给list()函数,或是将其它对象(例如元组、字符串)传递给list()函数,list()函数就会尝试将给定的对象转换为列表;
示例:
>>>a=[] #创建空列表
>>>b=list() #利用函数创建空列表
>>>c=[1,2,3] #创建含项的列表
>>>d=list((1,2,3)) #利用函数创建含项的列表
>>>e=(1,2,3)
>>>e
(1,2,3)
>>>f=list(e) #利用list()函数将元组转换为列表
>>>f
[1,2,3]
三是使用列表内涵的方法来创建列表,小的列表我们通常可以直接使用列表定义来来创建,但对于一些数据项比较多的列表,就需要使用程序来进行创建了。列表内涵就是指使用一个在方括号中按规定的逻辑规则通过判断或循环条件来生成需要数据项的列表。
列表内涵的语法格式:
[expression for item in iterable (if condition)]
(if condition)条件语句是根据你的需求可选的。
例如:我们要将100以内的偶数生成一个列表:
>>> a=[] #按一般程序来生成的列表
>>> for x in range(1,100): #此处range函数作用是逐项返回1至100之间的整数项
if x%2==0:
a.append(x) #将偶数加入到a列表的结尾
>>> a
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
>>>b=[x for x in range(0,100)]
>>>b
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>>c=[x for x in range(1,100) if x%2==0] #使用函数内涵生成列表
>>> c
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
同时使用列表内涵也可以进行嵌套。
>>> a=[str(x)+y+z for x in [1,2,3] for y in "abc" for z in ["abc","def","ghi","jkl"] if not (x==1 and y=="b")]
>>> a
['1aabc', '1adef', '1aghi', '1ajkl', '1cabc', '1cdef', '1cghi', '1cjkl', '2aabc', '2adef', '2aghi', '2ajkl', '2babc', '2bdef', '2bghi', '2bjkl', '2cabc', '2cdef', '2cghi', '2cjkl', '3aabc', '3adef', '3aghi', '3ajkl', '3babc', '3bdef', '3bghi', '3bjkl', '3cabc', '3cdef', '3cghi', '3cjkl']
三、列表的操作
(一)列表的方法
对于列表我们可以使用以下的方法进行操作:
语法 | 用途 |
---|---|
list.append(x) | 将数据项x追加到列表的尾部 |
list.count(x) | 统计x在列表中出现的次数并返回 |
list.entend(y) list+=y |
将列表y中的项追加到list的结尾 |
list.index(x,start,end) | 返回数据项x在列表中(或是在列表中start至end分区区块中)从最左算起出现的位置,如不存在就返回一个ValueError异常 |
list.insert(i,x) | 在列表的第i项(i为整数)处插入数据项x |
list.pop() | 返回并删除列表最右的数据项 |
list.pop(i) | 返回并删除列表第i项的数据项 |
list.remove(x) | 将列表中从左边算起第一个数据项x移除,如果x不存在就产生一个ValueError异常 |
list.reverse() | 将列表进行反转 |
list.sort(...) | 对列表中的数据项进行排序 |
(二)列表项的读取
对于列表中项的读取我们可以使用索引位置、分片或是序列拆分的方式进行读取,我们首先创建一个示例列表:
>>>stu=["zhang","上海",16,"181厘米",["足球","羽毛球","english"]]
>>>stu
['zhang', '上海', 16, '181厘米', ['足球', '羽毛球', 'english']]
示例:
>>>stu[1]
'上海'
>>>stu[-4] #负值从列表最右侧开始读取项
'上海'
>>>stu[0][2] #对于python来说字符串也是对象,也可以进行位置索引和分片
’a'
>>> stu[-1][2] #对于嵌套的列表也可以使用位置索引
'english'
>>> stu[2:] #分片读取
[16, '181厘米', ['足球', '羽毛球', 'english']]
>>>stu[-1][:2]
['足球', '羽毛球']
>>> stu[-1][1][2]
'球'
>>stu[::2] #使用分片读取数据项时,第三个参数为读取数据的步距,这里的2表示每隔2个读取数据,即读取0、2、4位置上的数据。
['zhang', 16, ['足球', '羽毛球', 'english']]
在有些情况下,我们也使用序列拆分的方式来实现对于数据项的读取。序列拆分需要使用拆分操作符*来进行。下面通过实例展示其用法:
>>>a,*b=[1,2,3,4]
>>> a
1
>>> b
[2, 3, 4]
>>>a,*b,c=[1,2,3,4]
>>> a
1
>>> b
[2, 3]
>>> c
4
(三)列表中项的修改和列表项的添加
- 列表内的数据项的修改
利用索引位置修改数据项:
>>> stu=["zhang","上海",16,"181厘米",["足球","羽毛球","english"]]
>>>stu[2]=18
>>> stu
['zhang', '上海', 18, '181厘米', ['足球', '羽毛球', 'english']]
>>> stu[4][2]="英语"
>>> stu
['zhang', '上海', 18, '181厘米', ['足球', '羽毛球', '英语']]
除了按索引位置对数据项进行修改,还可以通过分片来对整个分片数据进行修改和替换,分片的长度与你的提供的数据项并不必须是等长的,如果提供的数据项比分片长度少,那么就会使列表变短;反之,就会使列表变长。
>>> stu[0:2]=["zhao","南京"]
>>> stu
['zhao', '南京', 18, '181厘米', ['足球', '羽毛球', '英语']]
>>> stu[4][2:]=["乒乓球","棒球"]
>>> stu
['zhao', '南京', 18, '181厘米', ['足球', '羽毛球', '乒乓球', '棒球']]
- 列表数据项的添加
在列表的结尾处添加数据项我们可以使用+=运算符或是list.append()和list.extend()方法。它们的区别是list.append()方法只能将单个数据项添加到列表结尾,而+=和list.extend()则可以添加多个数据项到列表结尾。
>>> stu+=["80公斤","近视"]
>>> stu
['zhao', '南京', 18, '181厘米', ['足球', '羽毛球', '乒乓球', '棒球'], '80公斤', '近视']
>>> stu[4].extend(["武术","围棋"])
>>> stu
['zhao', '南京', 18, '181厘米', ['足球', '羽毛球', '乒乓球', '棒球', '武术', '围棋'], '80公斤', '近视']
>>> stu.append("35号")
>>> stu
['zhao', '南京', 18, '181厘米', ['足球', '羽毛球', '乒乓球', '棒球', '武术', '围棋'], '80公斤', '近视', '35号']
而对于在指定位置添加数据项可以使用list.insert()方法和分片。
>>> stu.insert(1,"男")
>>> stu
['zhao', '男', '南京', 18, '181厘米', ['足球', '羽毛球', '乒乓球', '棒球', '武术', '围棋'], '80公斤', '近视', '35号']
>>> stu[3:3]=["1999-06"] #这里要注意添加的数据项一定要用中括号括上,否则python会将"1999-06"拆分为7个字符,向原列表中添加7个数据项
>>> stu
['zhao', '男', '南京', '1999-06', 18, '181厘米', ['足球', '羽毛球', '乒乓球', '棒球', '武术', '围棋'], '80公斤', '近视', '35号']
(四)列表数据项的移除
移除列表中的数据项方法有很多种,可以使用list.pop()或是list.remove()方法,也可以使用del语句和分片。下面以实例说明:
>>> stu
['zhao', '男', '南京', '1996-06', 18, '181厘米', ['足球', '羽毛球', '乒乓球', '棒球', '武术', '围棋'], '80公斤', '近视', '35号']
>>> stu[6].pop() #使用不带参数的pop()方法时直接删除并返回最右侧的数据项
'围棋'
>>> stu.pop(3) #使用带索引位置的pop()方法可直接将指定索引位置的数据项移除
'1996-06'
>>> stu.remove('男') #使用remove()方法移除掉从最左侧第一个相符的数据项
>>> stu
['zhao', '南京', 18, '181厘米', ['足球', '羽毛球', '乒乓球', '棒球', '武术'], '80公斤', '近视', '35号']
>>> stu[1:3]=[] #将索引位置1至2的分片赋值空列表,相当于删除索引位置1和2处的数据项
>>> stu
['zhao', '181厘米', ['足球', '羽毛球', '乒乓球', '棒球', '武术'], '80公斤', '近视', '35号']
>>> del stu[2][1:4]
>>> stu
['zhao', '181厘米', ['足球', '武术'], '80公斤', '近视', '35号']
(五)列表的排序和反转
对于列表的排序我们可以使用list.sort()方法或是sorted()。区别在于使用list.sort()会直接对列表本身进行排序修改,而使用sorted()则生成一个新的排序列表,而原列表不做更改。sorted()的用法很多,这里只介绍一下最简单的。
>>> a=[2,4,3,1,8,3,5,2]
>>> a.sort()
>>> a
[1, 2, 2, 3, 3, 4, 5, 8]
>>> b=["ab","a","dge","rdw","cf"]
>>> b.sort()
>>> b
['a', 'ab', 'cf', 'dge', 'rdw']
>>> c=[3,7,4,6,7,1,0]
>>> sorted(c)
[0, 1, 3, 4, 6, 7, 7]
>>> c #使用sorted()进行排序原列表没有更改
[3, 7, 4, 6, 7, 1, 0]
使用list.reverse()可对整个列表进行反转。
>>> stu
['zhao', '181厘米', ['足球', '武术'], '80公斤', '近视', '35号']
>>> stu.reverse()
>>> stu
['35号', '近视', '80公斤', ['足球', '武术'], '181厘米', 'zhao']
(六)列表的其他操作
列表还支持使用in与not in进行成员关系测试,同时可以使用+和+=进行扩展连接,使用与=进行复制操作。具体的大家可以自行测试。