[PYTHON] 파이썬 : __getitem__에서 슬라이싱 구현하기
PYTHON파이썬 : __getitem__에서 슬라이싱 구현하기
내가 만드는 클래스에 대한 슬라이스 기능을 구현하려고하는데 이는 벡터 표현을 만듭니다.
나는 지금까지이 코드를 가지고 있는데, 슬라이스를 제대로 구현할 것이라고 믿지만, v가 벡터 인 곳의 호출을 할 때마다 파이썬은 충분한 매개 변수를 갖지 못했다는 오류를 반환합니다. 그래서 평범한 인덱스와 슬라이스를 처리하기 위해 클래스에서 getitem 특수 메소드를 정의하는 방법을 알아 내려고 노력하고 있습니다.
def __getitem__(self, start, stop, step):
index = start
if stop == None:
end = start + 1
else:
end = stop
if step == None:
stride = 1
else:
stride = step
return self.__data[index:end:stride]
해결법
-
==============================
1.__getitem __ () 메서드는 객체가 슬라이스 될 때 슬라이스 객체를받습니다. 슬라이스의 구성 요소를 가져 오려면 슬라이스 객체의 시작, 중지 및 단계 멤버를 살펴보십시오.
__getitem __ () 메서드는 객체가 슬라이스 될 때 슬라이스 객체를받습니다. 슬라이스의 구성 요소를 가져 오려면 슬라이스 객체의 시작, 중지 및 단계 멤버를 살펴보십시오.
>>> class C(object): ... def __getitem__(self, val): ... print val ... >>> c = C() >>> c[3] 3 >>> c[3:4] slice(3, 4, None) >>> c[3:4:-2] slice(3, 4, -2) >>> c[():1j:'a'] slice((), 1j, 'a')
-
==============================
2.나는 "합성"목록 (하나는 데이터가 당신이 메모리에서 만들고 싶을 것보다 더 큽니다)과 내 __getitem__은 다음과 같습니다 :
나는 "합성"목록 (하나는 데이터가 당신이 메모리에서 만들고 싶을 것보다 더 큽니다)과 내 __getitem__은 다음과 같습니다 :
def __getitem__( self, key ) : if isinstance( key, slice ) : #Get the start, stop, and step from the slice return [self[ii] for ii in xrange(*key.indices(len(self)))] elif isinstance( key, int ) : if key < 0 : #Handle negative indices key += len( self ) if key < 0 or key >= len( self ) : raise IndexError, "The index (%d) is out of range."%key return self.getData(key) #Get the data from elsewhere else: raise TypeError, "Invalid argument type."
슬라이스는 동일한 유형을 반환하지 않습니다.이 유형은 아니요 아니지만 나에게 적합합니다.
-
==============================
3.슬라이스 객체는 첨자 표기법에서 콜론을 사용할 때 자동으로 만들어집니다. 이것이 __getitem__에 전달됩니다. isinstance를 사용하여 슬라이스 객체가 있는지 확인하십시오.
슬라이스 객체는 첨자 표기법에서 콜론을 사용할 때 자동으로 만들어집니다. 이것이 __getitem__에 전달됩니다. isinstance를 사용하여 슬라이스 객체가 있는지 확인하십시오.
from __future__ import print_function class Sliceable(object): def __getitem__(self, given): if isinstance(given, slice): # do your handling for a slice object: print(given.start, given.stop, given.step) else: # Do your handling for a plain index print(given)
사용 예 :
>>> sliceme = Sliceable() >>> sliceme[1] 1 >>> sliceme[2] 2 >>> sliceme[:] None None None >>> sliceme[1:] 1 None None >>> sliceme[1:2] 1 2 None >>> sliceme[1:2:3] 1 2 3 >>> sliceme[:2:3] None 2 3 >>> sliceme[::3] None None 3 >>> sliceme[::] None None None >>> sliceme[:] None None None
-
==============================
4.이를 수행하는 올바른 방법은 __getitem__에 하나의 매개 변수를 사용하는 것입니다. 매개 변수는 숫자 또는 슬라이스 객체 일 수 있습니다.
이를 수행하는 올바른 방법은 __getitem__에 하나의 매개 변수를 사용하는 것입니다. 매개 변수는 숫자 또는 슬라이스 객체 일 수 있습니다.
만나다:
http://docs.python.org/library/functions.html#slice
http://docs.python.org/reference/datamodel.html#object.__getitem__
-
==============================
5.Aaron의 대답을 확장하려면 numpy와 같은 것에 대해 주어진 튜플인지 확인하여 다차원 슬라이싱을 할 수 있습니다.
Aaron의 대답을 확장하려면 numpy와 같은 것에 대해 주어진 튜플인지 확인하여 다차원 슬라이싱을 할 수 있습니다.
class Sliceable(object): def __getitem__(self, given): if isinstance(given, slice): # do your handling for a slice object: print("slice", given.start, given.stop, given.step) elif isinstance(given, tuple): print("multidim", given) else: # Do your handling for a plain index print("plain", given) sliceme = Sliceable() sliceme[1] sliceme[::] sliceme[1:, ::2]
```
산출:
('plain', 1) ('slice', None, None, None) ('multidim', (slice(1, None, None), slice(None, None, 2)))
from https://stackoverflow.com/questions/2936863/python-implementing-slicing-in-getitem by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 콤마와 공백으로 분리 (0) | 2018.10.10 |
---|---|
[PYTHON] 여러 키로 파이썬 사전 목록 정렬 (0) | 2018.10.09 |
[PYTHON] 파이썬에서 쓰레드 생성하기 (0) | 2018.10.09 |
[PYTHON] float 범위에서 임의의 숫자를 가져 오는 방법은 무엇입니까? (0) | 2018.10.09 |
[PYTHON] _tkinter.TclError : 표시 이름 없음 및 $ DISPLAY 환경 변수 없음 (0) | 2018.10.09 |