python中列表切片语法的问题

时间:2010-05-03 20:29:44

标签: python syntax slice

扩展的索引语法在python的doc。

中提到
slice([start], stop[, step])

使用扩展索引语法时也会生成切片对象。例如:a[start:stop:step]a[start:stop, i]。有关返回迭代器的备用版本,请参阅itertools.islice()

a[start:stop:step]按照描述工作。但是第二个呢?它是如何使用的?

2 个答案:

答案 0 :(得分:12)

a[start:stop,i]调用方法a.__getitem__((slice(start,stop,None), i))

如果TypeError是一个列表,则会引发a,但如果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]

PS。要试验将哪些切片发送到__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)

答案 1 :(得分:4)

符号[:,:]用于切片multidimensional arrays。 Python默认没有任何多维数组,但语法支持它,numpy例如利用这种语法。