복붙노트

[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. ==============================

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

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

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

    4.이를 수행하는 올바른 방법은 __getitem__에 하나의 매개 변수를 사용하는 것입니다. 매개 변수는 숫자 또는 슬라이스 객체 일 수 있습니다.

    이를 수행하는 올바른 방법은 __getitem__에 하나의 매개 변수를 사용하는 것입니다. 매개 변수는 숫자 또는 슬라이스 객체 일 수 있습니다.

    만나다:

    http://docs.python.org/library/functions.html#slice

    http://docs.python.org/reference/datamodel.html#object.__getitem__

  5. ==============================

    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)))
    
  6. from https://stackoverflow.com/questions/2936863/python-implementing-slicing-in-getitem by cc-by-sa and MIT license