目录
列表是Python很常用的数据类型,用方括号来表示,中间元素用英文逗号分割
创建一个列表
Game = ['Crossfire', 'Dota', 'CSGO', 'Apex']
Number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
值得提到的是,列表内的数据可以是不同的数据类型
List1 = [123, 'Python', 456, "苹果", [1, 2, 3]]
列表也是可以嵌套列表的。接下来假设一种应用场景,创建一个学生宿舍的数据库,每个寝室号收录入住学生的姓名
Room_301 = ['Li Hua', 'Zhang San', 'Li Si', 'Wang Wu'] #房间301
Room_302 = ['Han Meimei', 'Julie', 'Alice'] #房间302
Room_303 = ['Trump', 'James', 'Tom'] #房间303
由此可见这是一个国际化男女混寝哈,不过这不重要。每个寝室的寝室号要收录在一个总宿舍楼栋中:
Dormitory_1 = [Room_301, Room_302, Room_303] #1号宿舍楼
这个学校有多个宿舍楼栋,那么就可以将所有宿舍楼栋纳入一个列表:
Dormitory_2 = [] #2号宿舍楼
Dormitory_3 = [] #3号宿舍楼
Dormitory = [Dormitory_1, Dormitory_2, Dormitory_3]
列表元素的访问
使用编号来访问列表中的元素,从0开始递增,同样使用方括号。
比如,访问上述列表Game中的第一个元素:
print(Game[0]) #输出为Crossfire
如果像单个宿舍楼栋那样的二级列表,怎么访问其中的一级人员元素呢?
再加个中括号就行了,三级列表同理,例如访问1号楼栋301中的李华:
print(Dormitory_1[0][0]) #输出为Li Hua
print(Dormitory[0][0][0]) #输出为Li Hua
如果想访问列表中的最后一个元素,元素的编号可以用-1表示:
print(Game[-1]) #输出为Apex
同理,列表中倒数第二、第三个元素就可以用-2,-3来表示了。
列表的切片
利用切片索引
如果需要访问列表中连续多个元素,逐个访问或者使用循环访问显得有些麻烦。所以需要使用切片访问,可以使用两个索引,中间用冒号分隔:
Number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(Number[0:3]) #访问Number中的第1到第3个数字,输出为[0, 1, 2]
注意,冒号前的数字表示列表第n+1个元素开始,冒号后的数字表示到列表的第k个元素。
那么如果想访问列表的前三个元素,那么就可以进行一下简写,省略掉冒号前的数字,上述代码刚好符合该条件。
print(Number[:3]) #访问Number中前三个数字,输出为[0, 1, 2]
如果想访问后四个元素呢?那就要使用负数进行切片:
print(Number[-4:]) #访问Number中后四个数字,输出为[6, 7, 8, 9]
print(Number[-4:-1])#输出为[6, 7, 8]
print(Number[-4:-6])#输出为[]
print(Number[-4:0]) #输出为[]
第二行代码表示,使用负数进行索引时,冒号前的-n代表从倒数第n个元素开始,冒号后的-k代表到列表倒数第k+1个元素结束,和使用正数索引是相反的。
第三行代码表示,在使用切片操作时,如果第一个索引指定的元素Number[-4]在第二个索引指定的元素Number[-6]后面,结果就会为空序列。
第四行代码同理,索引0表示列表的第一个元素,在索引-4的前面,所以还是会输出空列表。
所以可以举一反三出其他的切片方式:
print(Number[:-2]) #连续访问到列表倒数第三个元素,输出为[0, 1, 2, 3, 4, 5, 6, 7]
print(Number[:]) #访问整个序列,输出为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
那进而又会产生另一个问题,如果我想从右向左提取列表元素呢?
切片的步长
在切片操作中,是可以选择步长的。在上述操作中,我们提取列表中的元素步长为1,即从一个元素直接移动到下一个元素,只不过我们省略了这个参数,省略情况下参数默认为1。
如果我们想显式地指定这个参数,就会衍生出更多的操作,就比如刚才提到的从右向左提取列表元素,我们只需要将步长设定为-1:
print(Number[-4:-6:-1]) #输出为[6, 5]
当步长为2时,就会在指定的起点和终点中每隔一个元素提取一个元素:
print(Number[0:10:2]) #输出为[0, 2, 4, 6, 8]
实际上,Python的语法往往都不那么严格,所以提取到的起始和最终元素不需要与给定的起点和终点完全重合:
print(Number[0:9:2]) #输出为[0, 2, 4, 6, 8]
print(Number[::2]) #输出为[0, 2, 4, 6, 8]
将终点的10换成了9,输出结果还是一样的,因为步长为2的时候是数不到第10个元素的,提取元素的顺序为第1,3,5,7,9个元素,对应列表中的0,2,4,6,8。
当然,起点和终点也是可以省略的,这样就代表遍历整个列表。
利用切片赋值
利用切片也可以在列表中插入新元素。
Number = [1,2,3] #创建Number列表
Number[3:] = [4, 5, 6] #在列表末尾插入元素
print(Number) #输出为[1, 2, 3, 4, 5, 6]
也可以插在序列中间,并且也是可以反向操作的。
Number = [1, 5, 6]
Number[1:1] = [2, 3, 4] #相当于在空切片中插入了[2, 3, 4]
print(Number) #输出为[1, 2, 3, 4, 5, 6]
Number[1:4] = []
print(Number) #输出为[1, 5, 6]
列表的方法
添加和插入元素
在列表末尾添加一个元素或对象,我们可以用.append方法:
Number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #创建Number列表
Number.append(10) #将元素10添加到列表末尾
print(Number) #输出为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
在列表末尾添加多个元素或对象,可以使用.extend方法
Number1 = [0, 1, 2, 3, 4] #创建Number1列表
Number2 = [5, 6, 7, 8, 9] #创建Number2列表
Number1.extend(Number2) #将Number2的所有元素添加到列表末尾
print(Number1) #输出为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
需要指定插入的位置,就需要使用.insert方法,用于将一个元素或对象插入列表:
Number = [0, 1, 2, 3, 4, 6, 7, 8, 9] #创建Number列表
Number.insert(5, 'five') #将元素five插入到列表第6个位置
print(Number) #输出为[0, 1, 2, 3, 4, 'five', 6, 7, 8, 9]
删除元素
实现对列表内元素的删除需要使用.pop方法,不指定参数的时候默认删除最后一个元素
Number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #创建Number列表
Number.pop() #默认删除最后一个元素
print(Number) #输出为[0, 1, 2, 3, 4, 5, 6, 7, 8]
Number.pop(0) #指定删除第一个元素
print(Number) #输出为[1, 2, 3, 4, 5, 6, 7, 8]
如果需要删除指定值的元素,需要用到.remove方法
Name = ['Li Hua', 'Han Meimei', 'Lucy', 'Alice'] #创建人名列表
Name.remove('Lucy') #删除'Lucy'元素
print(Name) #输出为['Li Hua', 'Han Meimei', 'Alice']
使用.remove方法只能删除指定值的第一个元素,即列表中有多个重复元素只能删除掉重复元素中的第一个。
使用del语句也是可以删除列表元素的
Name = ['Li Hua', 'Han Meimei', 'Lucy', 'Alice'] #创建人名列表
del Name[2] #删除第三个元素
print(Name) #输出为['Li Hua', 'Han Meimei', 'Alice']
复制列表
方法.copy用于复制列表
Num1 = [1, 2, 3]
Num2 = Num1.copy()
print(Num2) #输出为[1, 2, 3]
注意,使用.copy方法时,两列表不发生关联,即一个列表元素发生改变不会影响复制出来的列表,这与直接用等式赋值是不一样的。
Num1 = [1, 2, 3]
Num2 = Num1.copy()
print(Num2) #输出为[1, 2, 3]
Num2[0] = 2 #将Num2的第一个元素赋值为2
print(Num1) #输出为[1, 2, 3]
print(Num2) #输出为[2, 2, 3]
Num1 = [1, 2, 3]
Num2 = Num1 #用等式赋值
Num2[0] = 2 #将Num2的第一个元素赋值为2
print(Num1) #输出为[2, 2, 3]
print(Num2) #输出为[2, 2, 3]
可以看出,利用等式赋值给列表添加了一个名称,本质上还是两个名称对应一个列表,将Num2关联到Num1。而使用.copy方法会产生两个互相独立的列表,也可以理解为将Num2关联到了Num1的副本。
其他方法
.clear清空列表的内容
a = [1, 2, 3, 4]
a.clear()
print(a) #输出为[]
.count计算指定元素在列表中出现了多少次
a = [1, 2, [2, 6], 4, 1, 1, 3, [2, 6]]
print(a.count(1)) #输出为3,表示出现了3次
print(a.count([2, 6])) #输出为2
.index查找指定元素第一次出现时的索引
sentence = ['Hi', 'I', 'am', 'Python', 'I', 'love', 'Python']
print(sentence.index('Python')) #输出为3,表示Python元素第一次出现时的索引为3
.sort对列表直接进行排序
a = [1, 5, 0, 4, 2, 9]
a.sort() #对a进行排序
print(a) #输出为[0, 1, 2, 4, 5, 9]
注意,不能直接使用print(a.sort()),否则只会输出None,因为.sort方法不会返回任何值。