geekdoc-python-zh/docs/pythoncentral/how-to-slice-listsarrays-an...

9.6 KiB
Raw Permalink Blame History

如何在 Python 中切片列表/数组和元组

原文:https://www.pythoncentral.io/how-to-slice-listsarrays-and-tuples-in-python/

所以你已经有了一个列表、元组或数组,你想从中获得特定的子元素集合,而不需要任何冗长的循环?

Python 有一个惊人的特性,叫做切片。切片不仅可以用于列表、元组或数组,还可以用于定制数据结构,使用切片对象,这将在本文后面使用。

理解 Python 切片语法

为了理解 Python 中 slice 函数的工作原理,你有必要理解什么是索引。

在 Python 中,可以将 slice 函数用于几种不同的数据类型,包括列表、元组和字符串。这是因为 Python 在它们中使用了索引的概念。

类似列表的数据类型中的字符或元素的“索引”是字符或元素在数据类型中的位置。不管数据类型包含什么数据,索引值总是从零开始,以列表中的项数减一结束。

Python 还使用了负索引的概念使数据更容易访问。使用负索引Python 用户可以从容器的末尾而不是开头访问数据类型中的数据。

切片的语法为:

[python]
slice(start, end, step)
[/python]

切片功能同时接受多达三个参数。start 参数是可选的,它指示要开始对数据类型进行切片的容器的索引。如果没有提供值,则 start 的值默认为 【无】

另一方面,输入 stop 参数是强制性的,因为它向 Python 指示切片应该发生的索引。默认情况下Python 将在值“stop - 1”处停止切片

换句话说,如果使用 slice 函数时停止值为 5Python 将只返回值,直到索引值为 4。

Python 接受的最后一个参数叫做 step可以根据需要随意输入。它是一个整数值向 Python 表明当对列表进行切片时,用户希望在索引之间增加多少。默认的增量是 1但是用户可以在 step 中放入任何适用的正整数。

切片 Python 列表/数组和元组语法

让我们从一个正常的日常清单开始。

[python]
>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
[/python]

没什么疯狂的,只是一个从 1 到 8 的普通列表。现在假设我们真的希望子元素 2、3 和 4 在一个新的列表中返回。我们如何做到这一点?

不是用一个for循环,就是这样。这是 Pythonic 式的做事方式:

[python]
>>> a[1:4]
[2, 3, 4]
[/python]

这正是我们想要的结果。那个语法到底是什么意思?好问题。

我来解释一下。1表示从列表中的第二个元素开始(注意切片索引从0开始)。4表示在列表的第五个元素处结束,但不包括它。中间的冒号是 Python 的列表识别我们想要使用切片来获取列表中的对象的方式。

高级 Python 切片(列表、元组和数组)增量

我们还可以添加一个可选的第二子句,它允许我们设置列表的索引在我们设置的索引之间如何递增。

在上面的例子中,假设我们不希望返回难看的3,我们只希望列表中有好的偶数。很简单。

[python]
>>> a[1:4:2]
[2, 4]
[/python]

看,就这么简单。最后一个冒号告诉 Python 我们想要选择切片增量。默认情况下Python 将这个增量设置为1,但是数字末尾的额外冒号允许我们指定它是什么。

Python 逆向切片(列表、元组和数组)

好吧,如果我们想让我们的列表倒过来,只是为了好玩呢?让我们尝试一些疯狂的事情。

[python]
>>> a[::-1]
[8, 7, 6, 5, 4, 3, 2, 1]
[/python]

什么?!那是什么鬼东西?

列表在切片时有一个默认的功能。如果第一个冒号前没有值,则意味着从列表的起始索引开始。如果第一个冒号后没有值,就意味着一直到列表的末尾。这为我们节省了时间,这样我们就不必手动指定len(a)作为结束索引。

好吧。我最后偷偷溜了进去?这意味着每次增加索引-1,意味着它将通过向后遍历列表。如果想让偶数索引倒退,可以跳过每隔一个元素,将迭代设置为-2。简单。

切片 Python 元组

上面的一切也适用于元组。完全相同的语法和完全相同的做事方式。我举个例子只是为了说明确实是一样的。

[python]
>>> t = (2, 5, 7, 9, 10, 11, 12)
>>> t[2:4]
(7, 9)
[/python]

仅此而已。简单、优雅、强大。

使用 Python 切片对象

还有一种更容易理解的语法形式可以使用。Python 中有称为slice对象的对象,可以用来代替上面的冒号语法。

这里有一个例子:

[python]
>>> a = [1, 2, 3, 4, 5]
>>> sliceObj = slice(1, 3)
>>> a[sliceObj]
[2, 3]
[/python]

slice对象初始化接受 3 个参数,最后一个是可选的索引增量。一般的方法格式是:slice(start, stop, increment),应用于列表或元组时类似于start:stop:increment

就是这样!

Python 切片示例

为了帮助你理解如何使用 slice这里有一些例子:

#1 基本切片示例

让我们假设你有一个字符串列表,如下:

[python]
items = ['car', 'bike', 'house', 'bank', 'purse', 'photo', 'box']
[/python]

下面的代码使用 slice 函数从条目列表中导出一个子列表:

[python]
items = ['car', 'bike', 'house', 'bank', 'purse', 'photo', 'box']

sub_items = items[1:4]

print(sub_items)
[/python]

代码的输出是:

[python]
['bike', 'house', 'bank']
[/python]

由于起始索引是 1Python 以bike开始切片另一方面结束索引是 4所以切片在“bank”处停止列表

由于这个原因,代码的最终结果是一个包含三项的列表:自行车、房子和银行。因为这段代码没有使用 step所以 slice 函数接受该范围内的所有值,并且不跳过任何元素。

#2 用 Python Slice 切片列表中的前“N”个元素

使用 slice 从列表中获取前“N”个元素就像使用下面的语法一样简单:

[python]
list[:n]
[/python]

我们以之前的例子同一个列表为例,通过切片输出列表的前三个元素:

[python]
items = ['car', 'bike', 'house', 'bank', 'purse', 'photo', 'box']

sub_items = items[:3]

print(sub_items)
[/python]

代码将输出以下结果:

[python]
['car', 'bike', 'house']
[/python]

注意项目[:3]如何与项目[0:3] 相同

#3 用 Python Slice 从列表中获取最后“N”个元素

这个和上一个例子差不多,只是我们可以要求后三个要素,而不是要求前三个要素。

下面是我们如何处理上一个例子中的列表:

[python]
items = ['car', 'bike', 'house', 'bank', 'purse', 'photo', 'box']

sub_items = items[-3:]

print(sub_items)
[/python]

该代码将为我们提供以下结果:

[python]
['purse', 'photo', 'box']
[/python]

#4 使用 Python 对列表中的每“n”个元素进行切片

为此,我们必须使用 step 参数并返回我们想要的子列表。使用与之前相同的列表,并假设我们希望代码每隔一个元素返回一次:

[python]
items = ['car', 'bike', 'house', 'bank', 'purse', 'photo', 'box']

sub_items = items[::2]

print(sub_items)
[/python]

该代码将显示以下结果:

[python]
['car', 'house', 'purse', 'box']
[/python]

#5 使用 Python 切片反转列表

slice 函数使得反转列表变得异常简单。你只需要给 slice 函数一个负的步长,函数就会从列表的末尾到开头列出元素——反过来。

继续我们之前使用的示例列表:

[python]
items = ['car', 'bike', 'house', 'bank', 'purse', 'photo', 'box']

reversed_items = items[::-1]

print(reversed_items)
[/python]

这将为我们提供输出:

[python]
['box', 'photo', 'purse', 'bank', 'house', 'bike', 'car']
[/python]

#6 使用 Python 切片替换列表的一部分

除了可以提取列表的一部分slice 函数还可以让你很容易地改变列表中的元素。

在下面的代码中,我们将列表的前两个元素更改为两个新值:

[python]
items = ['car', 'bike', 'house', 'bank', 'purse', 'photo', 'box']

items[0:2] = ['new car', 'new bike']

print(items)
[/python]

代码的输出是:

[python]
['new car', 'new bike', 'house', 'bank', 'purse', 'photo', 'box']
[/python]

#7 用切片部分替换列表并调整其大小

使用 slice 函数改变元素和向列表中添加新元素非常容易:

[python]
items = ['car', 'bike', 'house', 'bank', 'purse', 'photo', 'box']

print("The list has {len{items)} elements")

items[0:2] = ['new car', 'new bike', 'new watch']

print(items)

print ("The list now has {len(items)} elements")
[/python]

该代码给出以下输出:

[python]
The list has 7 elements

['new car', 'new bike', 'new watch', 'house', 'bank', 'purse', 'photo', 'box']

The list has 8 elements
[/python]

#8 使用切片从列表中删除元素

使用我们一直在使用的示例列表,下面是如何使用 slice 函数从列表中删除元素:

[python]
items = ['car', 'bike', 'house', 'bank', 'purse', 'photo', 'box']

del items[2:4]
print(items)
[/python]

代码的输出是:

[python]
['car', 'bike', 'purse', 'photo', 'box']
[/python]

如果你想知道如何分割字符串,在另一篇名为如何在 Python 中从字符串中获取子字符串——分割字符串的文章中有所涉及。

目前就这些。希望你喜欢学习切片,我希望它会帮助你的追求。

再见。