2011-10-21 5 views
2

인덱스가 4부터 시작하여 9로 이동하는 배열을 만들고 싶습니다. <의 메모리 공간을 만드는 데 관심이 없습니다. 어떻게 진행하는 것이 가장 좋습니까? 다음과 같이 내 2D 코드는 다음과 같습니다파이썬 배열 인덱스 고정하기

arr = [[ 0 for row in range(2)] for col in range(1, 129)] 
>>> arr[0][0] = 1 
>>> arr[128][0] = 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
IndexError: list index out of range 
>>> arr[127][0] = 1 
선택적으로 바로 마지막 인덱스가 1 포함 128 0이 아니라 127이 아마 분명를 실행하는 특정 범위의 예를 사용하지만,이 작업을 수행 할 수있는 방법이 어떻게

?

dicts에 대한 제안에 감사드립니다. 나는 이것을 피하고 있습니다. 변환하는 코드의 대부분은 C에서 왔지만 사전은 구세주라고 생각합니다. 배열로 묻는 것을 할 수있는 방법이 있습니까?

스파 스 배열
+3

그리고 그냥 딕테이션을 사용할 수 없습니까? – Gandi

+0

목록을 기반으로 클래스를 만든 다음 요소에 액세스하기위한 메서드를 재정의 할 수 있습니다. 나는 당신이 정확히 무엇을 바꾸어야 만하는지 결코 말하지 않을 것입니다. – rplnt

+0

무엇을 원하십니까? –

답변

2

는 사용하십시오 dict :

sparseArray = {} 
sparseArray[(0,0)] = 1 
sparseArray[(128,128)] = 1 

print sparseArray # Show the content of the sparse array 
print sparseArray.keys() # Get all used indices. 
0

당신은 여기에 두 가지 옵션이 있습니다. 당신은 sparse lists을 사용할 수 있습니다, 또는 당신은 기본적으로 일반 목록과 시작 인덱스가 컨테이너 유형을 만들 수 등이

specialist.get(4) 

를 요청할 때 실제로

specialist.innerlist[4 - startidx] 
2

할 수 있습니다 단순히 emulate를 얻을 목록 :

class OffsetList(object): 
    def __init__(self, offset=4): 
    self._offset = offset 
    self._lst = [] 
    def __len__(self): 
    return len(self._lst) 
    def __getitem__(self, key): 
    return self._lst[key - self._offset] 
    def __setitem__(self, key, val): 
    self._lst[key - self._offset] = val 
    def __delitem__(self, key): 
    del self._lst[key - self._offset] 
    def __iter__(self): 
    return iter(self._lst) 
    def __contains__(self, item): 
    return item in self._lst 

    # All other methods go to the backing list. 
    def __getattr__(self, a): 
    return getattr(self._lst, a) 

# Test it like this: 
ol = OffsetList(4) 
ol.append(2) 
assert ol[4] == 2 
assert len(ol) == 1 
+0

좋은 구현! – kojiro

0

당신이 정말로 목록의 의미를 원한다면 모든, 당신이 할 수있는 가정

class OffsetyList(list): 
    def __init__(self, *args, **kwargs): 
     list.__init__(self, *args) 
     self._offset = int(kwargs.get("offset", 0)) 

    def __getitem__(self, idx): 
     return list.__getitem__(self, idx + self._offset) 

    def __setitem__(self, idx, value): 
     list.__setitem__(self, idx + self._offset, value) 

    # Implementing the rest of the class 
    # is left as an exercise for the reader. 

ol = OffsetyList(offset = -5) 
ol.extend(("foo", "bar", "baz")) 
print ol[5], ol[7], ol[6] 

하지만이 말은 아주 약해 보입니다.