«Нарезка» в документации по выражениям Python - PullRequest
15 голосов
/ 15 апреля 2009

Я не понимаю следующую часть документации по Python:

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

Имеется ли в виду нарезка списка (x=[1,2,3,4]; x[0:2]) ..? В частности, части, относящиеся к многоточию ..

slice_item       ::=  expression | proper_slice | ellipsis

Преобразование элемента слайса, который является выражением, является этим выражением. Преобразование элемента среза эллипса - это встроенный объект с многоточием.

Ответы [ 3 ]

21 голосов
/ 15 апреля 2009

Многоточие используется в основном расширением числовой 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]])

Здесь используется многоточие, чтобы указать заполнитель для остальных размеров массива, которые не указаны. Думайте об этом как об указании полного среза [:] для размеров, не указанных, поэтому для трехмерного массива a[...,0] совпадает с a[:,:,0], а для 4d a[:,:,:,0].

Обратите внимание, что фактический литерал Ellipsis (...) не может использоваться вне синтаксиса слайса в python2, хотя есть встроенный объект Ellipsis. Это то, что подразумевается под «Преобразованием элемента среза эллипса является встроенный объект с многоточием». то есть. «a[...]» фактически является сахаром для «a[Ellipsis]». В python3 ... обозначает Ellipsis где угодно, поэтому вы можете написать:

>>> ...
Ellipsis

Если вы не используете numpy, вы можете в значительной степени игнорировать все упоминания об Ellipsis. Ни один из встроенных типов не использует его, так что на самом деле все, что вам нужно, это чтобы списки проходили один объект слайса, который содержит элементы "start", "stop" и "step". а именно:

l[start:stop:step]   # proper_slice syntax from the docs you quote.

эквивалентно звонку:

l.__getitem__(slice(start, stop, step))
16 голосов
/ 15 апреля 2009

Определение простого тестового класса, который просто печатает то, что передается:

>>> class TestGetitem(object):
...   def __getitem__(self, item):
...     print type(item), item
... 
>>> t = TestGetitem()

Пример выражения:

>>> 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>

Пример среза:

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

Пример многоточия:

>>> t[...]
<type 'ellipsis'> Ellipsis

Кортеж с многоточием и ломтиком:

>>> t[...,1:]
<type 'tuple'> (Ellipsis, slice(1, None, None))
8 голосов
/ 15 апреля 2009

Что происходит, это. См http://docs.python.org/reference/datamodel.html#types и http://docs.python.org/library/functions.html#slice

Объекты среза используются для представления срезы, когда расширенный синтаксис среза используемый. Это кусочек с использованием двух двоеточия или несколько срезов или эллипсов через запятую, например, a [i: j: step], a [i: j, k: l] или a [..., я: J]. Они также созданы встроенная функция slice ().

Специальные атрибуты только для чтения: начало нижняя граница; стоп это верх связаны; шаг - значение шага; каждый Нет, если не указано. Эти атрибуты могут есть любой тип.

x=[1,2,3,4]
x[0:2]

"0: 2" преобразуется в объект Slice с началом 0, остановкой 2 и шагом None.

Этот 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)

Однако для класса встроенного списка необходимо переопределить специальный метод __getslice__.

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

Многоточие - это специальный синтаксис «игнорировать это измерение», предоставляемый многомерным слайсам.

Также см. http://docs.python.org/library/itertools.html#itertools.islice для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...