购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2.3 列表(List)

列表是Python特有的数据类型,用于存储由多个值构成的序列,其元素可以是字符串、数字、列表、元组等自定义的对象。列表使用[]来定义,用英文逗号分隔开其中的元素,元素是可以重复的。列表可以同时存储多种数据类型,也可以嵌套其他列表。

1.创建列表

不同数据项之间由逗号分隔,整体放在一个方括号里,这就是列表。例如:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    print(ls)

运行结果为:

    [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]

那么,如何定义一个空列表呢?

    ls = []

是不是很简单。

2.列表的基本操作
1)通过索引取出列表的元素

方法: 列表名[索引](索引从0开始计数)。

(1)下面来取出刚创建的列表中的嵌套索引及嵌套索引的元素:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    print(ls[6], ls[6][0])

运行结果为:

    [8, 5, 7] 8

(2)下面再试试取出不存在的索引会引发怎样的结果:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    print(ls[7])

运行结果为:

    IndexError:string index out of range

直接抛出错误。

(3)与字符串相同,当我们想取出列表中的最后一个字符时,可以直接取索引为−1的值。例如:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    print(ls[-1])

运行结果为:

    [8, 5, 7]
2)使用加号连接列表

直接使用加号将两个列表相加,会产生一个新列表,其中包含原来两个列表中的元素。例如:

    ls1 = [1, 2, 3]
    ls2 = ['a', 'b', 'c']
    print(ls1 + ls2)

运行结果为:

    [1, 2, 3, 'a', 'b', 'c']
3)列表元素复制

方法: 列表 * 复制次数。

将生成一个新列表,新列表中的元素是原列表中的元素的复制次数倍。例如:

    ls = [1, 2, 3]
    print(ls*3)

运行结果为:

    [1, 2, 3, 1, 2, 3, 1, 2, 3]
4)求列表长度

求列表长度将用到len()函数。例如:

    ls = [1, 2, 3, [8, 5, 7]]
    print(len(ls))

运行结果为:

    4
5)遍历列表元素

通过循环的方式遍历列表元素。例如:

    ls = [1, 2, 3, [8, 5, 7]]
    for i in ls:
       print(i)

运行结果为:

    1
    2
    3
    [8, 5, 7]
6)检查列表中是否存在某个元素

使用in关键字检查列表中是否存在某个元素,返回值为布尔值。例如:

    ls = [1, 2, 3, [8, 5, 7]]
    print(8 in ls)
    print([8, 5, 7] in ls)

运行结果为:

    False
    True
7)删除列表

可以使用del关键字手动删除列表(亦可等系统自动回收)。例如:

    ls = [1, 2, 3, [8, 5, 7]]
    del ls
    print(ls)

运行结果为:

    IndexError:string index out of range

删除之后,列表就无法使用了。

8)删除列表中索引为i的元素

也是使用del关键字来删除指定下标的元素。例如:

    ls = [1, 2, 3, [8, 5, 7]]
    print(ls[0])
    del ls[0]
    print(ls[0])
    print(ls)

运行结果为:

    1
    2
    [2, 3, [8, 5, 7]]

删除过后,会将后续元素下标往前挪一位。

9)返回列表中最大值与最小值

使用max()和min()函数返回列表中的最大值和最小值。例如:

    ls = [1, 2, 3]
    print(max(ls))
    print(min(ls))

运行结果为:

    3
    1

只适用于列表中的元素只有int、bool、float类型,或只有字符串且都没有嵌套列表的情形;否则,会直接报错。例如:

    ls = [1, 2, 3, [8, 5, 7]]
    print(max(ls))
    print(min(ls))

运行结果为:

    IndexError:string index out of range
3.列表切片

列表切片指的是将列表的一部分切出来,这有点像字符串切片。列表切片的形式:

    list[起始索引:终止索引(不包含):步长]

(1)使用时,如果省略起始索引,则默认为0;如果省略终止索引,则默认为列表中的最后一个元素且包含该元素;如果省略步长,则默认为1。例如:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    print(ls[:])
    print(ls[::])
    print(ls[1:5:2])

运行结果为:

    [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    [2, 4]

(2)逆序切片也与字符串相似,例如:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    print(ls[:-1])
    print(ls[::])
    print(ls[-5:-1:2])

运行结果为:

    [1, 2, 3, 4, 'a', 'b']
    [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    [3, 'a']

(3)再试一下其他操作,正向切片起始索引大于终止索引,逆向切片起始索引小于终止索引:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    print(ls[-1:-5:2])
    print(ls[5:1])

运行结果为:

    []
    []

不会报错,只是没有切出内容。

4.修改列表元素

列表是一种可变的数据类型,所以可以修改其元素。例如:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    print(ls)
    ls[1] = 'Python'
    print(ls)

运行结果为:

    [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    [1, 'Python', 3, 4, 'a', 'b', [8, 5, 7]]

除了通过索引修改元素外,还能通过切片的方式进行修改。例如:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    print(ls)
    ls[1:3] = 'a'
    print(ls)

运行结果为:

    [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    [1, 'a', 4, 'a', 'b', [8, 5, 7]]

新插入的元素数量小于切片的元素数量,列表长度会变短。但是,如果插入的是字符串或是列表,那会是什么结果呢?

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    ls[-3:-1] = ['n', 'e', 'w']
    print(ls)

运行结果为:

    [1, 2, 3, 4, 'n', 'e', 'w', [8, 5, 7]]

没想到吧,对于列表,并不是单纯地修改元素并使列表长度变短,而是把元素插入进去。

5.列表的操作方法

一些列表的操作方法如表2-2所示。

表2-2 列表的操作方法

接下来依次进行演示。

(1)list.append(obj),在列表末尾添加新对象:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    ls.append(['a', 'p', 'p'])
    print(ls)

运行结果为:

    [1, 2, 3, 4, 'a', 'b', [8, 5, 7], ['a', 'p', 'p']]

(2)list.count(obj),返回某个元素在列表中出现的次数:

    ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]]
    print(ls.count(1))

运行结果为:

    2

(3)list.extend(seq),在列表末尾添加另一个序列的所有元素:

    ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]]
    ls2 = ['a', 'p', 'p']
    ls.extend(ls2)
    print(ls)

运行结果为:

    [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3], 'a', 'p', 'p']

(4)list.index(obj),返回第一个匹配元素的索引值:

    ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]]
    print(ls.index(1))

运行结果为:

    0

若不存在,则会报错:

    ls = [2, 3, 4, 'a', 'b', [1, 2, 3]]
    print(ls.index(1))

运行结果为:

    ValueError:1 is not in list

(5)list.insert(index, obj),在指定索引之前插入对象:

    ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]]
    ls.insert(0, ['a', 'p', 'p'])
    print(ls)

运行结果为:

    [['a', 'p', 'p'], 1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]]

如果指定的索引不存在呢?

    ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]]
    ls.insert(20, ['a', 'p', 'p'])
    print(ls)

运行结果为:

    [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3], ['a', 'p', 'p']]

超过最大索引,则会插入在最后一个位置的后面。

(6)list.pop(index),移除指定索引的值,并返回该值:

    ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]]
    value = ls.pop(-1)
    print(ls)
    print(value)

运行结果为:

    [1, 2, 3, 4, 1, 'a', 'b']
    [1, 2, 3]

(7)list.remove(obj),移除第一个匹配的某对象:

    ls = [1, 2, 3, 4, 1, 'a', 'b', [1, 2, 3]]
    ls.remove(1)
    print(ls)

运行结果为:

    [2, 3, 4, 1, 'a', 'b', [1, 2, 3]]

(8)list.sort(),对原列表进行排序:

    ls = [8, 5, 7, -1, 9, 0, -1]
    ls.sort()
    print(ls)

运行结果为:

    [-1, -1, 0, 5, 7, 8, 9]

默认升序排列,如果要降序,该怎么实现呢?

    ls = [8, 5, 7, -1, 9, 0, -1]
    ls.sort(reverse=True)
    print(ls)

运行结果为:

    [9, 8, 7, 5, 0, -1, -1]

另外,只能对纯字符或纯数字排序,否则就会报错:

    ls = [8, 5, 7, -1, 9, 0, -1, 'a', 'b', 'c']
    ls.sort()
    print(ls)

运行结果为:

    TypeError:‘<’not supported between instances of ‘str’and ‘int’

(9)list.reverse(),反转列表元素:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    ls.reverse()
    print(ls)

运行结果为:

    [[8, 5, 7], 'b', 'a', 4, 3, 2, 1]
6.删除列表中的元素

de关键字可以删除整个列表或者列表中的元素。

(1)删除指定索引元素:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    del ls[0]
    print(ls)

运行结果为:

    [2, 3, 4, 'a', 'b', [8, 5, 7]]

(2)切片删除:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    del ls[:3]
    print(ls)

运行结果为:

    [4, 'a', 'b', [8, 5, 7]]

(3)删除整个列表:

    ls = [1, 2, 3, 4, 'a', 'b', [8, 5, 7]]
    del ls
    print(ls)

直接报错:

    NameError:name ‘ls’is not defined
7.列表生成式

在Python中,列表生成式体现了Python优雅的特色。

例如,创建一个元素是1~10的平方的列表:

    ls = [i*i for i in range(11)]
    print(ls)

运行结果为:

    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

一行代码就可以优雅地搞定。

对于双重或多重循环使用列表生成式,该如何生成列表呢?

将九九乘法口诀表放入列表:

    ls = [f'{i} x {j} = {i*j}' for i in range(1, 10) for j in range(1, 10) if i <= j]
    print(ls)

运行结果为: wrU1xs3BlRQ3GyYcnC9j1W2suYW9gNpMXLvtZRrpujWOS+HnBQkAZ1sw5e9jdZx9

     ['1 × 1 = 1', '1 × 2 = 2', '1 × 3 = 3', '1 × 4 = 4', '1 × 5 = 5', '1 × 6 = 6',
'1 × 7 = 7', '1 × 8 = 8', '1 × 9 = 9', '2 × 2 = 4', '2 × 3 = 6', '2 × 4 = 8',
'2 × 5 = 10', '2 × 6 = 12', '2 × 7 = 14', '2 × 8 = 16', '2 × 9 = 18', '3 × 3 = 9',
'3 × 4 = 12', '3 × 5 = 15', '3 × 6 = 18', '3 × 7 = 21', '3 × 8 = 24', '3 × 9 = 27',
'4 × 4 = 16', '4 × 5 = 20', '4 × 6 = 24', '4 × 7 = 28', '4 × 8 = 32', '4 × 9 = 36',
'5 × 5 = 25', '5 × 6 = 30', '5 × 7 = 35', '5 × 8 = 40', '5 × 9 = 45', '6 × 6 = 36',
'6 × 7 = 42', '6 × 8 = 48', '6 × 9 = 54', '7 × 7 = 49', '7 × 8 = 56', '7 × 9 = 63',
'8 × 8 = 64', '8 × 9 = 72', '9 × 9 = 81']
点击中间区域
呼出菜单
上一章
目录
下一章
×