ZetCode

Python 列表切片

最后修改于 2024 年 1 月 29 日

在本文中,我们将介绍如何在 Python 中创建列表切片。

列表是可变、有序的值集合。列表元素可以通过零基索引访问。

列表切片是列表中一部分元素的集合。

Python 切片语法

列表切片是一种操作,它从列表中提取某些元素并形成一个新的列表。可能具有不同的索引数量和不同的索引范围。

索引是零基的。它们可以是负数。

列表切片的语法如下

[start:end:step]

语法中的 start、end、step 部分是整数。它们都可以省略。它们可以是正数也可以是负数。不包含 end 索引处的值。

我们包含 end 索引之前的所有元素,但不包含 end 索引处的元素。

Python 列表切片 start/end

start 索引是开始索引;end 索引是切片的结束索引。

main.py
#!/usr/bin/python

vals = [-2, -1, 0, 1, 2, 3, 4, 5, 6]

last = len(vals)

s1 = vals[0:5]
print(s1)

s2 = vals[2:last]
print(s2)

程序创建了两个切片。

last = len(vals)

使用 `len` 函数,我们可以获得列表的大小。由于切片的 end 索引不包含在内,因此它可以用于切片语法。

s1 = vals[0:5]

我们使用 start=0 和 end=5 创建列表切片。索引为 0、1、2、3 和 4 的元素包含在切片中。

s2 = vals[2:last]

第二个切片包含索引为 2..最后一个元素-1 的元素。

$ ./main.py
[-2, -1, 0, 1, 2]
[0, 1, 2, 3, 4, 5, 6]

Python 列表切片省略索引

切片语法的所有三个索引都可以省略。如果我们省略 start 索引,则切片从第一个元素开始。如果我们省略 end 索引,则切片生成到最后一个元素。如果我们省略 step,则默认 step 为 1。

main.py
#!/usr/bin/python

vals = [-2, -1, 0, 1, 2, 3, 4, 5, 6]

s1 = vals[:3]
print(s1)

s2 = vals[3:]
print(s2)

s3 = vals[:]
print(s3)

s4 = vals[::]
print(s4)

在程序中,我们省略了索引。

s1 = vals[:3]

我们创建了一个从开头到第三个元素的切片。

s2 = vals[3:]
print(s2)

创建了一个从第四个元素到最后一个元素的切片。

s3 = vals[:]

这里我们创建了一个列表的副本。

s4 = vals[::]

这里我们也创建了一个列表的副本。

$ ./main.py
[-2, -1, 0]
[1, 2, 3, 4, 5, 6]
[-2, -1, 0, 1, 2, 3, 4, 5, 6]
[-2, -1, 0, 1, 2, 3, 4, 5, 6]

Python 切片负索引

索引可以是负数。负索引引用列表末尾的值。最后一个元素索引为 -1,倒数第二个元素索引为 -2 等。索引具有较低负数的索引必须先出现在语法中。这意味着我们写成 [-6, -2] 而不是 [-2, -6]。后者返回一个空列表。

main.py
#!/usr/bin/python

vals = [1, 2, 3, 4, 5, 6, 7, 8]

print(vals[-4:-1])
print(vals[:-2])
print(vals[-1:-4])

程序使用负 start/end 索引。

print(vals[-4:-1])

我们创建了一个从倒数第四个元素到倒数第二个元素的切片。

$ ./main.py 
[5, 6, 7]
[1, 2, 3, 4, 5, 6]
[]

Python 列表切片步长

切片语法中的第三个索引是步长。它允许我们从列表中获取每 n 个值。

main.py
#!/usr/bin/python

vals = [-2, -1, 0, 1, 2, 3, 4, 5, 6]

print(vals[1:9:2])
print(vals[::2])
print(vals[::1])
print(vals[1::3])

我们使用步长值形成四个新列表。

print(vals[1:9:2])

这里我们创建了一个切片,从第二个元素开始,到第八个元素结束,每隔一个元素取一个。新列表包含以下元素:[-1, 1, 3, 5]。

print(vals[::2])

这里我们通过从列表开头到结尾每隔一个值来构建一个切片。

print(vals[::1])

这创建了一个列表的副本。

print(vals[1::3])

切片包含从第二个元素开始到列表末尾的每第三个元素。

$ ./main.py
[-1, 1, 3, 5]
[-2, 0, 2, 4, 6]
[-2, -1, 0, 1, 2, 3, 4, 5, 6]
[-1, 2, 5]

Python 列表切片负数步长

使用负数步长,我们从末尾每隔 n 个元素取一个。start 索引必须大于 end 索引。

main.py
#!/usr/bin/python

vals = [-2, -1, 0, 1, 2, 3, 4, 5, 6]

print(vals[5:0:-2])
print(vals[::-2])
print(vals[::-1])

程序使用负数步长。

print(vals[5:0:-2])

我们创建了一个从第六个元素到第一个元素的切片,跳过每第二个元素。

print(vals[::-2])

这创建了一个从末尾到开头的每第二个元素的切片。

print(vals[::-1])

这一行创建了一个包含反转元素列表的副本。

$ ./main.py 
[3, 1, -1]
[6, 4, 2, 0, -2]
[6, 5, 4, 3, 2, 1, 0, -1, -2]

Python 列表切片赋值

切片语法可用于赋值。

main.py
#!/usr/bin/python

vals = [1, 2, 3, 4, 5, 6, 7, 8]

vals[0] = 10
vals[1:3] = 20, 30
vals[3::1] = 40, 50, 60, 70, 80

print(vals)

我们有一个包含八个整数的列表。我们使用切片语法将元素替换为新值。

$ ./main.py 
[10, 20, 30, 40, 50, 60, 70, 80]

来源

Python 数据结构 - 语言参考

在本文中,我们介绍了 Python 中的列表切片操作。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程