Python表达式文档中的"切片"

dbr*_*dbr 19 python syntax

我不理解Python文档的以下部分:

http://docs.python.org/reference/expressions.html#slicings

这是指列表切片(x=[1,2,3,4]; x[0:2])..?特别是涉及省略号的部分..

slice_item       ::=  expression | proper_slice | ellipsis
Run Code Online (Sandbox Code Playgroud)

作为表达式的切片项的转换是该表达式.省略号切片项的转换是内置的省略号对象.

Bri*_*ian 22

省略号主要由数字python扩展使用,它增加了一个多元数组类型.由于存在多个维度,因此切片变得比起始和停止索引更复杂; 能够切割多个维度也是有用的.例如,给定4x4阵列,左上区域将由切片"[:2,:2]"定义

>>> a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

>>> a[:2,:2]  # top left
array([[1, 2],
       [5, 6]])
Run Code Online (Sandbox Code Playgroud)

省略号用于指示未指定的其余数组维度的占位符.可以将其视为指示未指定尺寸的完整切片[:],因此对于3d数组,与4d a[...,0]相同a[:,:,0],a[:,:,:,0].

请注意,实际的省略号文字(...)在python2中的切片语法之外是不可用的,尽管有一个内置的Ellipsis对象.这就是"省略号切片项的转换是内置的省略号对象".即." a[...]"实际上是糖的" a[Ellipsis]".在python3中,...任何地方都表示省略号,所以你可以写:

>>> ...
Ellipsis
Run Code Online (Sandbox Code Playgroud)

如果你不使用numpy,你几乎可以忽略所有提到的省略号.没有内置类型使用它,所以你真正需要关心的是列表传递一个切片对象,包含" start"," stop"和" step"成员.即:

l[start:stop:step]   # proper_slice syntax from the docs you quote.
Run Code Online (Sandbox Code Playgroud)

相当于调用:

l.__getitem__(slice(start, stop, step))
Run Code Online (Sandbox Code Playgroud)

  • @user2357112supportsMonica,我尝试了`a = [0,1,2,3,4,5,6,7]; print(a[3, ..., 5])` 在 python2 和 python3 中都得到:`TypeError: 列表索引必须是整数,而不是元组`。 (2认同)

nos*_*klo 19

定义只打印正在传递的内容的简单测试类:

>>> class TestGetitem(object):
...   def __getitem__(self, item):
...     print type(item), item
... 
>>> t = TestGetitem()
Run Code Online (Sandbox Code Playgroud)

表达示例:

>>> t[1]
<type 'int'> 1
>>> t[3-2]
<type 'int'> 1
>>> t['test']
<type 'str'> test
>>> t[t]
<class '__main__.TestGetitem'> <__main__.TestGetitem object at 0xb7e9bc4c>
Run Code Online (Sandbox Code Playgroud)

切片示例:

>>> t[1:2]
<type 'slice'> slice(1, 2, None)
>>> t[1:'this':t]
<type 'slice'> slice(1, 'this', <__main__.TestGetitem object at 0xb7e9bc4c>)
Run Code Online (Sandbox Code Playgroud)

省略例子:

>>> t[...]
<type 'ellipsis'> Ellipsis
Run Code Online (Sandbox Code Playgroud)

带省略号和切片的元组:

>>> t[...,1:]
<type 'tuple'> (Ellipsis, slice(1, None, None))
Run Code Online (Sandbox Code Playgroud)


S.L*_*ott 9

这是怎么回事.请参阅http://docs.python.org/reference/datamodel.html#typeshttp://docs.python.org/library/functions.html#slice

当使用扩展切片语法时,切片对象用于表示切片.这是一个使用两个冒号的切片,或者用逗号分隔的多个切片或椭圆,例如a [i:j:step],a [i:j,k:l]或[...,i:j] .它们也是由内置的slice()函数创建的.

特殊的只读属性:start是下限; 停止是上限; step是步长值; 如果省略,则每个都是None.这些属性可以是任何类型.

x=[1,2,3,4]
x[0:2]
Run Code Online (Sandbox Code Playgroud)

将"0:2"转换为Slice对象,其开始为0,停止为2,步骤为无.

Slice对象提供给您定义的类x__getitem__方法.

>>> class MyClass( object ):
    def __getitem__( self, key ):
        print type(key), key


>>> x=MyClass()
>>> x[0:2]
<type 'slice'> slice(0, 2, None)
Run Code Online (Sandbox Code Playgroud)

但是,对于内置列表类,__getslice__必须重写特殊方法.

class MyList( list ):
    def __getslice__( self, i, j=None, k=None ):
        # decode various parts of the slice values
Run Code Online (Sandbox Code Playgroud)

省略号是提供给多维切片的特殊"忽略此维度"语法.

有关更多信息,另请参阅http://docs.python.org/library/itertools.html#itertools.islice.