2010-05-03 7 views
6

Синтаксис расширенного индексации упоминается в документе python.Проблема с синтаксисом фрагмента списка в python

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

Объекты среза также генерируются при использовании синтаксиса расширенного индексирования. Например: a[start:stop:step] или a[start:stop, i]. См. itertools.islice() для альтернативной версии, которая возвращает итератор.

a[start:stop:step] работает, как описано. Но как насчет второго? Как он используется?

+2

Так вы спрашиваете, что «я» означает «а [начать: остановиться, я]»? –

+0

Да, что такое «i», если a предполагается, что это последовательность? – Dingle

+0

'a' не обязательно является последовательностью одного из примитивных типов по умолчанию. – Amber

ответ

10

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 выбирает третий столбец:

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) 
+0

Я вижу. В принципе, [start: stop, i] работает только с многомерными массивами, реализованными в numpy. – Dingle

+0

@Dingle: Или вы можете определить свои собственные классы с помощью '__getitem__' и назначить свой собственный смысл и поведение! – unutbu

+0

Вопрос аналогичен http://stackoverflow.com/questions/752602/slicing-in-python-expressions-documentation, но ваш пример и код игрушек намного проще отслеживать. – Dingle

3

Обозначение [:,:] используется для ломтики multidimensional arrays. Python по умолчанию не имеет многомерных массивов, но синтаксис поддерживает его, а numpy, например, использует этот синтаксис.

+2

И любой другой пользовательский объект, который потенциально реализовал многомерную нарезку через '__getitem __()'. – Amber

Смежные вопросы