2.3 列表

前面学到的字符串是一种容器类型,容器类型就是指可以把多个元素整合在一起的类型,就像一个大包,可以把其他东西全丢进去。字符串只能把字符类型的元素整合在一起,如果想要把不同类型的元素整合在一起,可以使用列表。列表即list,作用是可以把任何类型的元素按照从左到右的顺序放在一起,在写法上是用半角中括号表示一个列表,列表里的元素用半角逗号分隔,比如说[66, 3.14, “Python”, [25, “Off i ce”]]就是一个列表,里面包含了整型、浮点型、字符串、列表,列表里面可以再放列表,所以只要你开心,列表是可以无限嵌套的。如果列表中没有嵌套列表,我们把它叫作一维列表,如果嵌套了一层,我们把它叫作二维列表,嵌套两层就是三维列表了,以此类推,生活中的四维、五维空间可能不好描述,但用列表描述一万维都很轻松。

2.3.1 新建列表

创建一个空列表可以使用半角中括号“[ ]”也可以使用“list()”,代码如下:

my_list1 = list()
my_list2 = []
print(type(my_list1), my_list1)  # 输出:<class 'list'> []
print(type(my_list2), my_list2)  # 输出:<class 'list'> []

如果你希望列表初始化的时候就有一些元素,可以把元素写在中括号里,代码如下:

my_list3 = ["A", 2, 3.0, []]
print(type(my_list3), my_list3)  # 输出:<class 'list'> ['A', 2, 3.0, []]
print("my_list3有{}个元素".format(len(my_list3)))
# 输出:my_list3有4个元素

2.3.2 查询列表元素

我想你应该还没有忘记可以使用索引和切片访问字符串的元素,这同样适用于列表,事实上,适用于所有容器类型。在讲字符串的时候,已经解释清楚索引和切片了,以后不再详细讲解它们的特点和用法,如果你是直接跳到这里的,麻烦你再原路跳回去,不用谢。来看看下面的代码:

type_list = [
    "水果",
    ["苹果", "梨", "蜜桃"],
    "设备",
    ["手机", "电脑", "平板"]
]
print(type_list[0])  # 输出:水果
print(type_list[1])  # 输出:['苹果', '梨', '蜜桃']
print(type_list[1][-1])  # 输出:蜜桃
sub_list = type_list[0:2]
print(sub_list)  # 输出:['水果', ['苹果', '梨', '蜜桃']]

上面是一个二维列表,第0个和第2个元素是字符串,第1和3个元素是列表。对于所有容器类型,都可以使用len()获取元素长度(即元素个数)。索引和切片的参数都支持正数和负数,0代表第一个位置,-1代表最后一个位置。注意一下,如果要访问嵌套列表的元素,需要一层一层去获取,例如type_list[1][-1]表示先访问列表type_list的第1个元素即[“苹果”, “梨”, “蜜桃”],再访问该元素的最后一个元素,即“蜜桃”。

还有一种情况是需要查询某个元素的索引,我们可以使用list对象的index()方法,该方法只要传入被查询的元素对象即可返回该元素的索引,但如果该元素不存在,则报错,与字符串的index()用法是一样的。代码如下:

type_list = [
    "水果",
    ["苹果", "梨", "蜜桃"],
    "设备",
    ["手机", "电脑", "平板"]
]
data_index = type_list.index("设备")
print(f'"设备"的索引是{data_index}')  # 输出:"设备"的索引是2
print(type_list.index("苹果"))  # 报错,因为type_list[1]才有"苹果"

2.3.3 增加列表元素

如果想在列表末尾增加元素,可以使用list对象的append()方法,如果想在指定位置插入元素可以使用list对象的insert()方法。先看一下append()方法,代码如下:

my_list = [1, 2, 3]
my_list.append(4)
my_list.append(5)
my_list.append(["A"])  # 输出:[1, 2, 3, 4, 5, ['A']]
print(my_list)

再来看一下insert()方法,该方法可以传入两个参数:第一个参数是插入位置的下标,代表插入到第几个元素的前面,注意下标是从0开始的;第二个参数是插入的值,即插入哪个元素。代码如下:

my_list = ["A", "B", "C"]
my_list.insert(1, 20)
print(my_list)  # 输出:['A', 20, 'B', 'C']
my_list.insert(25, "30")
print(my_list)  # 输出:['A', 20, 'B', 'C', '30']

从代码中可以看出,my_list.insert(1, 20)表示在列表my_list索引为1的元素(即“B”)的前面插入一个整型元素20,我们还可以发现如果该索引超过了列表的最大长度,它不会报错,而是把元素插在了列表末尾。

2.3.4 修改列表元素

修改元素非常简单,都用索引访问到元素了,索性再给它重新赋个值不就是修改了吗?看一下下面的代码演示就秒懂了:

my_list = ["A", "B", "C"]
my_list[1] = "BBB"
print(my_list)  # 输出:['A', 'BBB', 'C']

2.3.5 删除列表元素

删除元素也有好几种方法,这里介绍三种比较常用的。

(1)如果你想删除某个指定的元素,可以使用list对象的remove()方法,该方法只要传入你要删除的元素对象即可,每调用一次删除一个元素,当要删除的元素不存在的时候,程序会报“ValueError: list.remove(x): x not in list”的错误。代码如下:

my_list = ["A", "B", "B", "B", "C"]
my_list.remove("B")
print(my_list)  # 输出:['A', 'B', 'B', 'C']
my_list.remove("B")
my_list.remove("B")
print(my_list)  # 输出:['A', 'C']
my_list.remove("B")  # 报错

(2)如果你想通过下标删除元素,可以使用list对象的pop()方法,该方法可以传入一个参数指定被删除元素的位置,如果不传入参数则删除最后一个元素,如果该位置对应的元素不存在则会报“IndexError: pop index out of range”的错误。另外还需要注意一下使用该方法删除元素成功之后会返回被删除的元素,我们可以使用变量去接收它。代码如下:

                                      ?
my_list = ["A", "B", "C", "D"]
my_list.pop(0)
print(my_list)  # 输出:['B', 'C', 'D']
del_data = my_list.pop()
print(del_data)  # 输出:D
print(my_list)  # 输出:['B', 'C']
my_list.pop(100)  # 报错

(3)还有一种删除的方法是调用Python的“del”关键字,它不仅能删除列表里的元素,也可以删除Python的任何变量,看一下下面的代码:

my_list = ["A", "B", "C", "D"]
del my_list[2]
print(my_list)  # 输出:['A', 'B', 'D']
del my_list
print(my_list)

代码中my_list[2]是指访问列表中索引为2 的元素,即“C”,然后使用关键字“del”删掉该元素。如果你使用“del”删除掉整个my_list变量,后面你再去访问该变量的时候,程序就会报“NameError: name ‘my_list’ is not def i ned”的错误,所以“del”关键字一般用于手动释放内存,但Python有一套比较完善的内存管理机制,所以我们一般很少主动使用“del”关键字。另外再提一下,既然“del”是Python的关键字,那么它能被当作变量使用吗?如果你不能在0.5秒内想出答案,请翻回变量命名规则那里再复习一下。

如果想清空一个列表,或者说删除列表的所有元素,可以使用列表对象的clear()方法,代码如下:

my_list = ["A", "B", "C", "D"]
my_list.clear()
print(my_list)  # 输出:[]

2.3.6 合并多个列表

如果想把多个列表合并成一个列表,该怎么操作?还记得加号吗?数字类型可以相加,字符串也可以相加,其实列表也是可以相加的。代码如下:

my_list1 = ["A", "B", "C"]
my_lis2 = ["a", "b", "c"]
my_lis3 = my_list1 + my_lis2
print(my_lis3)  # 输出:['A', 'B', 'C', 'a', 'b', 'c']

列表相加不会改变原来的列表,而是会返回一个合并之后的新列表。另外列表也是可以相乘的,不管相加还是相乘,都不是对每一个元素进行算术运算,而是返回一个拥有重复元素的新列表。代码如下:

my_list1 = [1, 2, 3]
my_list2 = my_list1 * 3
print(my_list1)  # 输出:[1, 2, 3]
print(my_list2)  # 输出:[1, 2, 3, 1, 2, 3, 1, 2, 3]

2.3.7 列表元素统计

如果想统计某个列表的元素个数的话,可以使用前文所提的len()函数,只要是容器类型都可以使用len()函数统计该容器的长度。len()函数是Python内置函数,比较常用的相似的函数还有max()和min()这两个函数,分别用来获取一个容器的最大值和最小值,代码如下:

min_data = min([1, 20, 0])
print(min_data)  # 输出0
max_data = max(["A", "f", "2"])
print(max_data)  # 输出:f

上面的代码使用min()函数获取到列表[1, 20, 0]的最小值是0,还是比较容易理解的,但是用max()函数获取列表[“A”, “f”, “2”]的最大值,返回的是字符“f”是为什么呢?因为当max()或min()函数的参数元素全部为字符串时,它们会全部比较元素的ASCII,字符“A”“f”“2”对应ASCII分别是65、102、50,所以max()函数返回的是“f”。如果这两个函数参数的元素既有数字类型又有字符串类型,程序是会报错的,不信的话可以动手试一下。

但如果是想知道某一个元素在列表里出现了几次,这时候len()函数就不适用了,但我们可以使用list对象的count()方法进行统计,代码如下:

my_list = ["A", "B", "B", "B", "C"]
print(my_list.count("B"))  # 输出:3