Python中列表切片语法的问题
在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)