Проблема с синтаксисом фрагмента списка в Python - PullRequest
8 голосов
/ 04 мая 2010

Расширенный синтаксис индексации упоминается в документе Python.

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

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

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

Ответы [ 2 ]

12 голосов
/ 04 мая 2010

a[start:stop,i] вызывает метод a.__getitem__((slice(start,stop,None), i)).

Это вызывает TypeError, если a - список, но это правильная и полезная нотация, если a - массив с пустыми значениями. На самом деле, я считаю, что разработчики Numpy попросили разработчиков Python точно расширить действительную нотацию Python-среза, чтобы легче реализовывать нотацию среза массива.

Например,

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)
4 голосов
/ 04 мая 2010

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

...