geekdoc-python-zh/docs/pythonlibrary/python-101-learning-about-l...

13 KiB
Raw Permalink Blame History

Python 101:了解列表

原文:https://www.blog.pythonlibrary.org/2020/03/10/python-101-learning-about-lists/

列表是 Python 编程语言中的一种基本数据类型。一个列表是一个可变序列,通常是同类项目的集合。可变意味着您可以在列表创建后对其进行更改。您会经常看到包含其他列表的列表。这些被称为嵌套列表。您还将看到包含各种其他数据类型的列表,如字典、元组或对象。

让我们来看看如何创建列表!

创建列表

有几种方法可以创建列表。您可以通过以下任何一种方式构建列表:

  • 使用一对方括号创建一个空列表: []
  • 使用带逗号分隔项的方括号:【123】
  • 使用列表理解:【x for x in iterable】
  • 使用 list() 函数:list(iterable)

iterable 是一个序列,一个支持迭代的容器或者一个 iterator 对象。列表本身和字符串一样是序列。

让我们来看几个创建列表的例子,这样你就可以看到它的作用了:

>>> my_list = [1, 2, 3]
>>> my_list
[1, 2, 3]

第一个例子非常简单。在这里,您创建了一个包含 3 个数字的列表。然后打印出来,验证它包含了您认为应该包含的内容。

创建列表的下一种方法是使用 Python 内置的 list() 函数:

>>> list_of_strings = list('abc')
>>> list_of_strings
['a', 'b', 'c']

在本例中,您将三个字母的字符串传递给 list()函数。它自动遍历字符串中的字符,创建一个包含三个字符串的列表,其中每个字符串都是一个字符。

最后一个例子是如何创建空列表:

>>> empty_list = []
>>> empty_list
[]
>>> another_empty_list = list()
>>> another_empty_list
[]

创建空列表的最快方法是使用方括号,而不用在里面放任何东西。第二种最简单的方法是不带任何参数调用 list()。一般来说,使用 list()的好处是可以用它将兼容的数据类型转换为列表就像前面的例子中使用字符串“abc”一样。

列出方法

Python 列表有几个可以调用的方法。以下是您可以对列表使用的方法列表:

  • 追加()
  • 清除()
  • 复制()
  • 计数()
  • 扩展()
  • 索引()
  • 插入()
  • 流行()
  • 移除()
  • 反向()
  • 排序()

其中大部分将在下面的章节中介绍。先说具体章节没有涉及到的。

您可以使用 count() 来计算传入的对象的实例数。

这里有一个例子:

>>> my_list = list('abcc')
>>> my_list.count('a')
1
>>> my_list.count('c')
2

这是一个简单的方法来计算列表中一个条目出现的次数。

index() 方法对于查找列表中项目的第一个实例很有用:

>>> my_list = list('abcc')
>>> my_list.index('c')
2
>>> my_list.index('a')
0

Python 列表是零索引的所以“a”在位置 0“b”在位置 1依此类推。

您可以使用 reverse()方法来就地反转列表*:*

>>> my_list = list('abcc')
>>> my_list.reverse()
>>> my_list
['c', 'c', 'b', 'a']

注意, reverse() 方法返回 None。这意味着如果你试图将反转列表赋给一个新变量你可能会得到意想不到的结果:

>>> x = my_list.reverse()
>>> print(x)
None

这里你最终得到的是 None 而不是反向列表。这就是到位的意思。原来的列表是反向的,但是 reverse() 方法本身不返回任何东西。

现在让我们看看你能用其他的列表方法做什么!

添加到列表

有三种列表方法可用于添加到列表中。它们如下:

  • 追加()
  • 扩展()
  • 插入()

append() 方法会将一个项目添加到一个预先存在的列表的末尾:

>>> my_list = list('abcc')
>>> my_list
['a', 'b', 'c', 'c']
>>> my_list.append(1)
>>> my_list
['a', 'b', 'c', 'c', 1]

首先,创建一个由四个单字符字符串组成的列表。然后在列表末尾追加一个整数。现在列表应该有 5 个项目1 在最后。

您可以使用 Python 的内置 len() 函数来检查列表中的项目数量:

>>> len(my_list)
5

这告诉你,事实上你在列表中有五个条目。但是如果你想在列表末尾之外的地方添加一个元素呢?

为此,您可以使用 insert() :

>>> my_list.insert(0, 'first')
>>> my_list
['first', 'a', 'b', 'c', 'c', 1]

insert() 方法有两个参数:

  • 要插入的位置
  • 要插入的项目

在上面的代码中,您告诉 Python 您想要将字符串“first”插入到 0 位置,这是列表中的第一个位置。

还有两种方法可以将项目添加到列表中。您可以使用 extend() 将 iterable 添加到列表中:

>>> my_list = [1, 2, 3]
>>> other_list = [4, 5, 6]
>>> my_list.extend(other_list)
>>> my_list
[1, 2, 3, 4, 5, 6]

这里您创建了两个列表。然后使用 my_listextend() 方法将 other_list 中的项目添加到 my_list 中。extend() 将遍历传入列表中的条目,并将它们添加到列表中。

您也可以使用串联来组合列表:

>>> my_list = [1, 2, 3]
>>> other_list = [4, 5, 6]
>>> combined = my_list + other_list
>>> combined
[1, 2, 3, 4, 5, 6]

在这种情况下,您创建两个列表,然后使用 Python 的 + 操作符将它们组合起来。

您还可以在 Python 列表中使用 += :

>>> my_list = [1, 2, 3]
>>> other_list = [4, 5, 6]
>>> my_list += other_list
>>> my_list
[1, 2, 3, 4, 5, 6]

这是合并两个列表的更简单的方法。

现在让我们学习如何访问和改变列表中的元素。

访问和更改列表元素

列表是用来处理的。您将需要学习如何访问单个元素以及如何更改它们。

让我们从学习如何访问一个项目开始:

>>> my_list = [1, 2, 3]
>>> my_list[0]
1
>>> my_list[2]
3

要访问列表中的一个项目,您需要使用方括号,并传入您希望访问的项目的索引。在上面的例子中,您访问第一个和第三个元素。

列表还支持通过使用负值反向访问项目:

>>> my_list[-1]
3

这个例子演示了当你传入 -1 时,你得到的是返回列表中的最后一项。尝试使用其他值,看看是否可以使用负索引获得第一项。

如果您试图使用一个列表中不存在的索引,您将得到一个 IndexError :

>>> my_list[-5]
Traceback (most recent call last):
Python Shell, prompt 41, line 1
builtins.IndexError: list index out of range

现在让我们学习如何移除物品!

从列表中删除

从列表中删除项目非常简单。从列表中删除项目有 4 种主要方法:

  • 清除()
  • 流行()
  • 移除()
  • 是吗

您可以使用 clear() 从列表中删除所有内容。让我们看看它是如何工作的:

>>> my_list = [1, 2, 3]
>>> my_list.clear()
>>> my_list
[]

调用 clear() 后,列表现在为空。当您处理完列表中的项目,并且需要从头开始时,这可能会很有用。当然,你也可以这样做来代替**【clear()】**:

>> my_list = []

这将创建一个新的空列表。如果总是使用同一个对象对你来说很重要,那么使用 clear() 会更好。如果这不重要,那么将其设置为空列表也很好。

如果您想删除单个项目,那么您应该签出 pop()或 remove()。先说 pop() :

>>> my_list = [1, 2, 3]
>>> my_list.pop()
3
>>> my_list
[1, 2]

您可以向 pop() 传递一个索引来移除并返回一个项目。或者可以像上面的例子那样不带参数地调用 pop(),它将默认删除列表中的最后一项并返回它。 pop() 是从列表中删除项目的最灵活的方式。

如果列表是空的或者你传入了一个不存在的索引, pop() 将抛出一个异常:

>>> my_list.pop(10)
Traceback (most recent call last):
  Python Shell, prompt 50, line 1
builtins.IndexError: pop index out of range

现在让我们来看看 remove()是如何工作的:

>>> my_list = [1, 2, 3]
>>> my_list.remove(2)
>>> my_list
[1, 3]

remove() 将删除传入项的第一个实例。所以在这种情况下,您告诉列表删除第一次出现的数字 2。

如果您告诉 remove() 删除一个不在列表中的项目,您将收到一个异常:

>>> my_list.remove(4)
Traceback (most recent call last):
  Python Shell, prompt 51, line 1
builtins.ValueError: list.remove(x): x not in list

您还可以使用 Python 内置的 del 关键字从列表中删除项目:

>>> my_list = [1, 2, 3]
>>> del my_list[1]
>>> my_list
[1, 3]

如果您尝试删除不存在的索引,将会收到一条错误消息:

>>> my_list = [1, 2, 3]
>>> del my_list[6]
Traceback (most recent call last):
  Python Shell, prompt 296, line 1
builtins.IndexError: list assignment index out of range

现在让我们来学习如何对列表进行排序!

对列表进行排序

Python 中的列表可以排序。可以使用内置的 sort() 方法对列表进行就地排序,也可以使用 Python 的 sorted()函数。

让我们创建一个列表并尝试对其进行排序:

>>> my_list = [4, 10, 2, 1, 23, 9]
>>> my_list.sort()
>>> my_list
[1, 2, 4, 9, 10, 23]

这里你创建了一个包含 6 个整数的列表,它们的顺序非常随机。为了对列表进行排序,您调用它的 sort()方法,该方法将对列表进行就地排序。这意味着 sort() 不会返回任何内容。

Python 的一个常见误解是,如果调用 sort() ,可以将结果赋给一个变量,如下所示:

>>> sorted_list = my_list.sort()
>>> print(sorted_list)
None

然而,当你这样做时,你会看到 sort() 实际上并没有返回一个排序后的列表。它总是不返回任何值。

幸运的是,您也可以为此使用 Python 的内置 sorted() 方法:

>>> my_list = [4, 10, 2, 1, 23, 9]
>>> sorted_list = sorted(my_list)
>>> sorted_list
[1, 2, 4, 9, 10, 23]

如果你使用 sorted() 它将返回一个新的列表默认情况下是升序排序。sorted()函数也允许你按指定的键排序,你可以通过设置它的反转标志告诉它升序或降序排序。

让我们按降序排列这个列表:

>>> my_list = [4, 10, 2, 1, 23, 9]
>>> sorted_list = sorted(my_list, reverse=True)
>>> sorted_list
[23, 10, 9, 4, 2, 1]

当你有一个更复杂的数据结构时,比如一个嵌套列表或者一个字典,你可以使用 sorted() 以特殊的方式进行排序,比如按键或者按值。

列表切片

Python 列表支持切片的思想。分割列表是通过使用方括号并输入开始和停止值来完成的。例如,如果您有 my_list[1:3],您会说您想要创建一个新的列表,其元素从索引 1 到 3 开始,但不包括索引 3。

这里有一个例子:

>>> my_list = [4, 10, 2, 1, 23, 9]
>>> my_list[1:3]
[10, 2]

这个切片返回索引 1 (10)和索引 2 (2)作为新列表。

您也可以使用负值进行切片:

>>> my_list = [4, 10, 2, 1, 23, 9]
>>> my_list[-2:]
[23, 9]

在本例中,您没有指定结束值。这意味着您希望从列表中的倒数第二个项目 23 开始,并将其移动到列表的末尾。

让我们尝试另一个例子,其中您只指定了结束索引:

>>> my_list = [4, 10, 2, 1, 23, 9]
>>> my_list[:3]
[4, 10, 2]

在本例中,您希望获取从索引 0 开始到索引 3 的所有值,但不包括索引 3。

复制列表

偶尔你会想要复制一个列表。复制列表的一个简单方法是使用 copy 方法:

>>> my_list = [1, 2, 3]
>>> new_list = my_list.copy()
>>> new_list
[1, 2, 3]

这成功地创建了一个新列表,并将其赋给变量 new_list。

但是请注意,当您这样做时,您正在创建所谓的“浅层拷贝”。这意味着,如果你的列表中有对象,它们可以被改变,这将影响两个列表。例如,如果您的列表中有一个词典,而该词典被修改了,则两个列表都会改变,这可能不是您想要的。

您也可以使用以下有趣的语法来复制列表:

>>> my_list = [1, 2, 3]
>>> new_list = my_list[:]
>>> new_list
[1, 2, 3]

这个例子告诉 Python 从 0(第一个)元素到最后一个元素创建一个切片,这实际上是整个列表的副本。

您还可以使用 Python 的 list() 函数来复制一个列表:

>>> my_list = [1, 2, 3]
>>> new_list = list(my_list)
>>> new_list
[1, 2, 3]

但是不管你选择哪种方法,不管是通过[:] copy() 还是 list() ,这三种方法都会进行浅层复制。如果你遇到奇怪的问题,改变一个列表会影响复制的列表,那么你应该使用复制模块中的 deepcopy 方法。

包扎

在本文中,您了解了 Python 美妙的 list 数据类型。当你用 Python 编程时,你将会广泛地使用列表。在这里,您学习了如何创建列表、编辑列表以及从列表中删除项目。你学会了如何完全清除列表。您发现了如何对列表进行排序以及如何对列表进行切片。最后,您了解了关于复制列表的所有内容,以及这样做时可能会遇到的陷阱。*