列表基本概念
本章和下一章,我们将逐步学习列表的基本概念,以及如何使用列表。列表是新手可以直接使用的最强大的Python功能之一,它既可以只存储几个元素,又可以存储上百万个元素。
3.1 什么是列表
列表(List)由一些列按照特定顺序排列的元素构成,它通常包含多个元素,元素之间既可以有逻辑关系,也可以无任何关联。
Python使用方括号[]
表示列表,用逗号分隔其中的元素。例如,我们创建一个包含四种编程语言名称的列表:
>>> languages = ["Python","Java","C++","Go"]
>>> print(languages)
['Python', 'Java', 'C++', 'Go']
如果要将列表打印出来,Python会默认使用方括号包裹列表元素,元素之间使用逗号分割。
3.1.1 访问列表元素
列表是一个有序的数据集合,想要访问列表中的元素,我们可以使用元素的索引(在列表中的序号)。
例如,我们想要访问languages列表的第一个元素:
>>> languages = ["Python","Java","C++","Go"]
>>> print(languages[0])
Python
我们还可以针对列表的元素,调用上一章节介绍的字符串方法,例如使用upper()
方法让元素改为全大写:
>>> languages = ["Python","Java","C++","Go"]
>>> print(languages[0].upper())
PYTHON
3.1.2 列表元素索引
在Python中,列表的索引是从0开始的,也就是列表第一个元素的索引编号是0,大多数的编程语言皆是如此。
所以,在Python中访问第二个元素使用索引1,第三个元素使用索引2,以此类推。
>>> languages = ["Python","Java","C++","Go"]
>>> print(languages[1]) # 访问第二个元素
Java
>>> print(languages[2]) # 访问第三个元素
C++
Python还提供了一种倒序访问列表元素的方法,我们可以使用负数表示列表元素的倒排序,例如-1表示倒数第一个元素,-2表示倒数第二个元素。
>>> languages = ["Python","Java","C++","Go"]
>>> print(languages[-1]) # 访问倒数第一个元素
Go
>>> print(languages[-2]) # 访问倒数第二个元素
C++
这是一种非常有用的语法,特别是当你不知道列表具体长度的时候,可以直接倒排序访问元素。
3.2 列表元素增删改
大多数情况下,我们都需要对列表元素进行修改,从而满足程序运行的需要。例如,我们使用一个列表记录一个班级所有的学生,当有学生退出这个班级时就需要删除元素。
3.2.1 修改列表元素
修改元素列表的语法和访问元素类似,只需要将新的元素值赋值到元素上即可。例如,我们有一个人名列表,我们可以修改其中第二个元素的值:
>>> names=["xiaoming","xiaohong","xiaoli","xiaozhang"]
>>> names[1]="xiaoliu"
>>> names
['xiaoming', 'xiaoliu', 'xiaoli', 'xiaozhang']
3.2.2 添加列表元素
Python提供了多种在既有列表中添加新数据的方式。
在列表的末尾追加元素
列表操作方法append()
可以将新元素追加到列表的末尾。
>>> nums=[1,2,3]
>>> nums.append(4)
>>> nums
[1, 2, 3, 4]
我们还可以创建一个空列表,根据业务需要,不断的追加数据:
>>> my_cars=[]
>>> my_cars.append('Bentley')
>>> my_cars.append('Lamborghini')
>>> my_cars.append('Ferrari')
>>> my_cars
['Bentley', 'Lamborghini', 'Ferrari']
这种从空列表开始的追加方式非常常见,因为在程序运行初期往往是从空开始的,伴随着不断的运行,不断的往列表中追加数据。
指定位置插入元素
使用insert()
方法可以将新元素插入到列表的任意位置,例如,我们在一个列表的头部插入一个元素:
>>> my_cars = ['Bentley', 'Lamborghini', 'Ferrari']
>>> my_cars.insert(0,'xiaomi')
>>> my_cars
['xiaomi', 'Bentley', 'Lamborghini', 'Ferrari']
在使用insert()
方法时,需要提供两个参数,第一个参数是需要插入的位置,被占用位置的旧元素向后移一个位置,第二个元素是需要插入的新元素。
同样的,我们还可以使用insert()
方法实现在末尾插入一个元素:
>>> my_cars = ['Bentley', 'Lamborghini', 'Ferrari']
>>> my_cars.insert(3,'xiaomi')
>>> my_cars
['Bentley', 'Lamborghini', 'Ferrari', 'xiaomi']
此外,我们还可以使用负数作为下标插入元素,但是情况可能和想象的稍有差别:
>>> my_cars = ['Bentley', 'Lamborghini', 'Ferrari']
>>> my_cars.insert(-2,'xiaomi')
>>> my_cars
['Bentley', 'xiaomi', 'Lamborghini', 'Ferrari']
以上代码在倒数第二个位置插入了新元素,插入完成后新元素的下标并非-2,而是-3,造成这种现象的原因是:被占用的元素会向后移动一个位置!。
3.2.3 删除列表元素
删除列表元素也是列表操作的重要组成部分,我们在编写程序时经常需要从列表中删除数据,例如注销账户时就需要把用户从列表中删掉。
del 删除语句
del
语句可以删除列表指定位置的元素,例如删除第二个元素:
>>> my_cars = ['Bentley', 'Lamborghini', 'Ferrari']
>>> del my_cars[1] # 删除第二个元素
>>> my_cars
['Bentley', 'Ferrari']
pop()删除末尾元素
在有些场景下,我们希望在删除元素后继续使用元素的值,这就需要使用pop()
方法(del
方法删除后,元素值完全消失了),pop()
方法在删除元素后,还会返回被删除元素的值。
pop()
方法会默认从列表的末尾删除元素:
>>> my_cars = ['Bentley', 'Lamborghini', 'Ferrari']
>>> last_car = my_cars.pop()
>>> my_cars
['Bentley', 'Lamborghini']
>>> last_car
'Ferrari'
pop()
方法和push()
方法常常结对使用,用来模拟栈数据结构的先进后出特性,这在算法编写中至关重要。
pop()删除任意元素
如果我们给pop()
方法传入一个索引值,那么它就可以根据索引值删除列表中任意位置的元素:
>>> my_cars = ['Bentley', 'Lamborghini', 'Ferrari']
>>> car = my_cars.pop(1)
>>> my_cars
['Bentley', 'Ferrari']
>>> car
'Lamborghini'
remove()删除指定值
有时候,我们只知道要删除元素的值,而不知道元素具体的位置,就需要使用remove()
方法删除指定的值:
>>> my_cars = ['Bentley', 'Lamborghini', 'Ferrari']
>>> my_cars.remove('Lamborghini')
>>> my_cars
['Bentley', 'Ferrari']
注意,remove()
方法只删除遇到的第一个和目标值相同的元素,如果列表中有多个相同的元素,那么只会删除第一个:
>>> my_cars = ['Bentley', 'Lamborghini', 'Ferrari', 'Ferrari']
>>> my_cars.remove('Ferrari')
>>> my_cars
['Bentley', 'Lamborghini', 'Ferrari']
以上代码只是删除了第一个"Ferrari"
,第二个元素仍然保留。如果想要彻底删除全部的相同值,就需要使用循环,这在后继章节会有介绍。
3.3 列表排序
将一个元素值无序的列表转为有序的列表是一个常见的需求,Python针对这个需求提供了多个列表排序方法。
3.3.1 sort()永久排序
现在,假设我们有一个存储考试成绩的无序列表,我们希望将列表按照递增的顺序排列,那么我们就可以使用sort()
方法:
>>> scores = [99,34,29,100]
>>> scores.sort()
>>> scores
[29, 34, 99, 100]
注意,sort()
方法会直接修改原列表的元素顺序,修改后的列表再也无法恢复到原来的顺序。
除了对数字进行排序,我们还可以对字符串进行排序:
>>> words = ['abandon','python','java']
>>> words.sort()
>>> words
['abandon', 'java', 'python']
字符串排序的时候,使用的是字母顺序,顺序和26个英文字母的顺序是一致的。
除了顺序排列列表元素之外,我们还可以给sort()
方法传入一个参数,让列表倒序排列:
>>> scores = [99,34,29,100]
>>> scores.sort(reverse=True)
>>> scores
[100, 99, 34, 29]
3.3.2 sorted()临时排序
如果我们希望将列表排序的同时,保持原列表内容顺序不变,就需要使用sorted()
方法:
>>> scores = [99,34,29,100]
>>> sorted(scores)
[29, 34, 99, 100]
>>> scores
[99, 34, 29, 100]
以上代码中sorted()
方法会返回列表的新顺序,同时保持原列表顺序不变。
我们还可以给sorted()
方法传入reverse=True
参数,从而实现倒排序效果:
>>> sorted(scores,reverse=True)
[100, 99, 34, 29]
3.3.3 reverse()反转列表
要反转元素顺序,可以使用reverse()
方法:
>>> values=[1,3,'abc','bbc',2.3]
>>> values.reverse()
>>> values
[2.3, 'bbc', 'abc', 3, 1]
注意,reverse()
不会将元素按照顺序或者逆序排列,仅仅是将原列表原封不动的点到顺序。
reverse()
会永久的修改原列表的顺序,如果再次调用reverse()
方法,列表就会重新调转回来。
3.3.4 获取列表长度
使用len
方法可以快速的获取列表的长度。
>>> students=['xiaoming','xiaohong','xiaoli']
>>> len(students)
3
3.4 本章小节
通过本章节内容,我们学习了Python数据类型List的基本概念,以及针对List的增删改操作。同事,我们还学习了列表的排序、反转和长度获取方法。