列表 是 Python 中的一种数据结构,是一个可变、有序的元素序列。列表中的每个元素或值被称为一个项。就像字符串是在引号之间定义的字符一样,列表是通过在方括号 [ ]
之间放置值来定义的。
列表非常适合在需要处理许多相关值时使用。它们使您能够将属于一起的数据保存在一起,简化代码,并对多个值同时执行相同的方法和操作。
在考虑 Python 列表和其他集合类型的数据结构时,考虑一下计算机上的所有不同集合:文件的集合,歌曲播放列表,浏览器书签,电子邮件,可以在流媒体服务上访问的视频集合等等。
首先,让我们创建一个包含字符串数据类型项的列表:
sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp', 'anemone']
当我们打印出列表时,输出与我们创建的列表完全相同:
print(sea_creatures)
['shark', 'cuttlefish', 'squid', 'mantis shrimp', 'anemone']
作为一个有序的元素序列,列表中的每个项都可以通过索引单独调用。列表是一种由较小部分组成的复合数据类型,非常灵活,因为可以添加、删除和更改其值。当您需要存储大量值或迭代值,并且希望能够方便地修改这些值时,您可能希望使用列表数据类型。
在本教程中,我们将介绍一些在 Python 中使用列表的方法。
列表中的每个项对应一个索引号,这是一个整数值,从索引号 0
开始。
对于列表 sea_creatures
,索引的拆分如下:
‘shark’ | ‘cuttlefish’ | ‘squid’ | ‘mantis shrimp’ | ‘anemone’ |
---|---|---|---|---|
0 | 1 | 2 | 3 | 4 |
第一个项,字符串 'shark'
从索引 0
开始,列表以项 'anemone'
的索引 4
结束。
由于 Python 列表中的每个项都有一个相应的索引号,我们能够以与其他顺序数据类型相同的方式访问和操作列表。
现在我们可以通过引用其索引号来调用列表的离散项:
print(sea_creatures[1])
cuttlefish
此列表的索引号范围为 0
-4
,如上表所示。因此,要单独调用任何项,我们将使用以下索引号引用:
sea_creatures[0] = 'shark'
sea_creatures[1] = 'cuttlefish'
sea_creatures[2] = 'squid'
sea_creatures[3] = 'mantis shrimp'
sea_creatures[4] = 'anemone'
如果我们使用大于 4 的任何索引号调用列表 sea_creatures
,它将超出范围,因为它将无效:
print(sea_creatures[18])
IndexError: list index out of range
除了正索引号,我们还可以使用负索引号访问列表中的项目,从列表的末尾开始向后计数,从 -1
开始。如果我们有一个很长的列表,并且希望精确指定列表末尾的项目,这将特别有用。
对于同一个列表 sea_creatures
,负索引的拆分如下:
‘shark’ | ‘cuttlefish’ | ‘squid’ | ‘mantis shrimp’ | ‘anemone’ |
---|---|---|---|---|
-5 | -4 | -3 | -2 | -1 |
因此,如果我们想要通过使用其负索引号打印项目 'squid'
,我们可以这样做:
print(sea_creatures[-3])
squid
我们可以使用 +
运算符将列表中的字符串项与其他字符串连接起来:
print('Sammy is a ' + sea_creatures[0])
Sammy is a shark
我们能够将索引号与列表中的项关联起来,以离散方式访问列表的每个项。
我们可以使用索引将列表中的项更改为不同的值。这使我们能够更好地控制列表,因为我们能够修改和更新它们包含的项。
如果我们想要将索引为 1
的项目的字符串值从 'cuttlefish'
更改为 'octopus'
,我们可以这样做:
sea_creatures[1] = 'octopus'
现在,当我们打印 sea_creatures
时,列表将会有所不同:
print(sea_creatures)
['shark', 'octopus', 'squid', 'mantis shrimp', 'anemone']
我们也可以使用负索引号更改项目的值:
sea_creatures[-3] = 'blobfish'
print(sea_creatures)
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone']
现在,'blobfish'
已经替换了负索引号为 -3
(对应正索引号 2
)的 'squid'
。
能够修改列表中的项使我们能够以高效的方式更改和更新列表。
我们还可以调用列表中的一些项。假设我们只想打印出 sea_creatures
的中间项,我们可以通过创建一个切片来实现。使用切片,我们可以通过创建由冒号 [x:y]
分隔的索引号范围来调用多个值:
print(sea_creatures[1:4])
['octopus', 'blobfish', 'mantis shrimp']
在创建切片时,例如 [1:4]
,第一个索引号是切片开始的地方(包括),第二个索引号是切片结束的地方(不包括),这就是为什么在我们上面的例子中,位置 1
、2
和 3
的项会被打印出来。
如果我们想要包含列表 sea_creatures
的开头的任一端,我们可以省略 list[x:y]
语法中的一个数字。例如,如果我们想要打印出列表 sea_creatures
的前三个项 —— 'shark'
、'octopus'
、'blobfish'
—— 我们可以这样做:
print(sea_creatures[:3])
['shark', 'octopus', 'blobfish']
这打印了列表的开头,停在索引 3
之前。
要包含列表末尾的所有项,我们将反转语法:
print(sea_creatures[2:])
['blobfish', 'mantis shrimp', 'anemone']
我们还可以在切片列表时使用负索引号,类似于正索引号:
print(sea_creatures[-4:-2])
print(sea_creatures[-3:])
['octopus', 'blobfish']
['blobfish', 'mantis shrimp', 'anemone']
我们还可以在切片中使用名为步幅的参数,它指的是在从列表检索第一个项目之后移动多少项目。到目前为止,我们已经省略了步幅参数,并且 Python 默认为步幅 1
,因此从两个索引号之间检索的每个项目。
构造的语法是 list[x:y:z]
,其中 z
是步幅。让我们创建一个更大的列表,然后切片它,并给步幅赋值 2
:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
print(numbers[1:11:2])
[1, 3, 5, 7, 9]
我们的构造 numbers[1:11:2]
打印了包括 1
和不包括 11
的索引号之间的值,然后步幅值为 2
,告诉程序只打印每隔一个项目。
我们可以省略前两个参数,仅使用步幅作为参数,其语法为 list[::z]
:
print(numbers[::3])
[0, 3, 6, 9, 12]
通过将步幅设置为 3
,只打印每三个项目。
使用正索引号和负索引号切片列表,并指定步幅,使我们能够控制列表并获得我们想要的输出。
运算符可以用于修改列表。我们将介绍使用 +
和 *
运算符及其复合形式 +=
和 *=
。
+
运算符可用于连接两个或多个列表:
sea_creatures = ['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone']
oceans = ['Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']
print(sea_creatures + oceans)
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']
由于 +
运算符可以连接,因此它可用于将一个列表的项(或多个项)添加到另一个列表的末尾。记得将项放在方括号中:
sea_creatures = sea_creatures + ['yeti crab']
print(sea_creatures)
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
*
运算符可用于复制列表。也许您需要将目录中的所有文件的副本复制到服务器上,或者与朋友共享播放列表 —— 在这些情况下,您需要复制数据的集合。
让我们将 sea_creatures
列表乘以 2
,将 oceans
列表乘以 3
:
print(sea_creatures * 2)
print(oceans * 3)
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
['Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']
通过使用 *
运算符,我们可以按照指定的次数复制我们的列表。
我们还可以使用 +
和 *
运算符的复合形式与赋值运算符 =
结合使用。+=
和 *=
复合运算符可用于以快速和自动化的方式填充列表。您可以使用这些运算符使用占位符填充列表,稍后可以使用用户提供的输入修改这些占位符,例如。
让我们向列表 sea_creatures
添加一个以列表形式的项目。此项将作为占位符,并且我们想要多次添加此占位符项目。为此,我们将使用 +=
运算符与 for 循环:
for x in range(1, 4):
sea_creatures += ['fish']
print(sea_creatures)
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'fish']
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'fish', 'fish']
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'fish', 'fish', 'fish']
对于循环的每次迭代,都会向原始列表 sea_creatures
添加额外的列表项 'fish'
。
*=
运算符的行为类似:
sharks = ['shark']
for x in range(1, 4):
sharks *= 2
print(sharks)
['shark', 'shark']
['shark', 'shark', 'shark', 'shark']
['shark', 'shark', 'shark', 'shark', 'shark', 'shark', 'shark', 'shark']
+
和 *
运算符可用于连接列表和复制列表。复合运算符 +=
和 *=
可以连接列表和复制列表,并将新的标识传递给原始列表。
可以使用 del
语句从列表中删除项目。这将删除您在列表中指定索引号处的值。
从 sea_creatures
列表中删除项 'octopus'
。此项位于索引位置 1
。为了删除该项,我们将使用 del
语句,然后调用列表变量和该项的索引号:
sea_creatures = ['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
del sea_creatures[1]
print(sea_creatures)
['shark', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
现在,索引位置 1
处的字符串 'octopus'
不再在我们的列表 sea_creatures
中。
我们还可以指定范围使用 del
语句。比方说我们想要删除不仅 'octopus'
这一项,还有 'blobfish'
和 'mantis shrimp'
。我们可以使用 del
语句在 sea_creatures
中调用一个范围来实现:
sea_creatures = ['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']
del sea_creatures[1:4]
print(sea_creatures)
['shark', 'anemone', 'yeti crab']
通过在 del
语句中使用范围,我们能够删除索引号为 1
(包括)到索引号为 4
(不包括)之间的项,留下包含 3 个项的列表。
del
语句允许我们从列表数据类型中删除特定的项。
列表可以用由列表组成的项定义,其中每个括号内的列表都包含在父列表的较大括号中:
sea_names = [['shark', 'octopus', 'squid', 'mantis shrimp'], ['Sammy', 'Jesse', 'Drew', 'Jamie']]
这些列表内的列表称为嵌套列表。
要访问此列表中的项,我们将不得不使用多个索引号:
print(sea_names[1][0])
print(sea_names[0][0])
Sammy
shark
第一个列表,因为它等同于一个项,其索引号为 0
,这将是构造中的第一个数字,而第二个列表将索引号为 1
。在每个内部嵌套列表中,将有单独的索引号,我们将在第二个索引号中调用它:
sea_names[0][0] = 'shark'
sea_names[0][1] = 'octopus'
sea_names[0][2] = 'squid'
sea_names[0][3] = 'mantis shrimp'
sea_names[1][0] = 'Sammy'
sea_names[1][1] = 'Jesse'
sea_names[1][2] = 'Drew'
sea_names[1][3] = 'Jamie'
在处理列表的列表时,重要的是要牢记,为了访问相关嵌套列表中的特定项,您将需要引用多个索引号。
列表数据类型是一种灵活的数据类型,可以在程序执行过程中进行修改。本教程介绍了列表的基本特性,包括索引、切片、修改和连接列表。从这里,您可以通过阅读 “如何使用列表方法” 了解更多有关在 Python 中使用列表的信息,并学习有关使用现有列表创建列表的 列表推导式。