Python中列表切片语法的问题

8 投票
2 回答
2933 浏览
提问于 2025-04-15 22:18

在Python的文档中提到了扩展索引语法。

slice([start], stop[, step])

当使用扩展索引语法时,也会生成切片对象。例如:a[start:stop:step] 或者 a[start:stop, i]。你可以查看 itertools.islice(),这是一个返回迭代器的替代版本。

a[start:stop:step] 的用法如上所述。那么第二种用法呢?它是怎么用的呢?

2 个回答

4

这个符号 [:,:] 是用来切片多维数组的。Python 默认情况下并没有多维数组,但它的语法是支持这种操作的。比如,numpy 这个库就利用了这种语法。

12

a[start:stop,i] 这个写法实际上是在调用方法 a.__getitem__((slice(start,stop,None), i))

如果 a 是一个列表,这样做会报 TypeError 错误,但如果 a 是一个 numpy 数组,这种写法就是有效且有用的。实际上,我相信 Numpy 的开发者曾请求 Python 的开发者扩展有效的 Python 切片语法,以便更容易实现 numpy 数组的切片功能。

举个例子,

import numpy as np
arr=np.arange(12).reshape(4,3)
print(arr)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]

1:3 这个切片会选择第 1 行和第 2 行,而 2 则选择第 3 列:

print(arr[1:3,2])
# [5 8]

补充说明:如果你想试试传给 __getitem__ 的切片是什么,可以用下面这段玩具代码来实验:

class Foo(list):
    def __getitem__(self,key):
        return repr(key)

foo=Foo(range(10))
print(foo[1:5,1,2])
# (slice(1, 5, None), 1, 2)

撰写回答