2013-04-06 2 views
0

파이썬에서는 JavaScript 배열 (즉, 값이 배열 범위 밖에서 추가 될 때 자동으로 확장되는 배열)을 모방 할 수 있습니까? 값이 배열의 인덱스 밖에 할당 될 때 자바 스크립트에서 배열은 자동으로 확장하지만, 파이썬, 그들은하지 않습니다 :파이썬에서의 JavaScript 배열 모방

theArray = [None] * 5 
theArray[0] = 0 
print(theArray) 
theArray[6] = 0 '''This line is invalid. Python arrays don't expand automatically, unlike JavaScript arrays.''' 

이 자바 스크립트에 유효한 것, 내가 파이썬에서 그것을 모방하기 위해 노력하고있어 :

var theArray = new Array(); 
theArray[0] = 0; 
console.log(theArray); 
theArray[6] = 0; //the array expands automatically in JavaScript, but not in Python 
+0

당신이 범위를 벗어난 인덱스에 작성해야 이유가 거기에 너무,이 방법 얻을 에 대한 동작을 복사하는 방법을 보여 게시합니다? 그리고 당신이 그것을 자동적으로 할 필요가 있고 당신 스스로 그것을 할 수없는 어떤 이유가 있습니까? 당신이 궁금해 할 것 같아요. 그러나 당신의 의도에 대해서도 마찬가지입니다. – Ian

+0

@Ian JavaScript 라이브러리를 파이썬으로 이식하려고하기 때문에 파이썬에서 자바 스크립트처럼 작동하는 객체 유형을 찾아야합니다 정렬. –

+0

글쎄 뭔가를 찾을 수 있을지 확신하지 못합니다. 그리고 다시, 나는 누군가가 우리가 잊고있는 것을 생각할 것이라고 확신한다. 그러나 내가 말했듯이, 당신이 원하는 것을하는 새로운 기능을 만들 수없는 이유가 있습니까? 단지'python_list [100] = "what anything"라고 말하는 대신에'insertWithAutoFill (python_list, 100, "anything")'을해야합니다. 방금 간단한 함수를 작성했습니다. 사용/구현하는 데 문제가 있습니까? 그 중 하나, 또는 방법 으로이 특별한 기능을 가진 목록을 모방하여 자신의 클래스를 만드는 것입니다 – Ian

답변

4

완벽하게 보장되지였습니다 : (다른 파이썬 기능을 통합

class ExpandingList(list): 
    def __setitem__(self, key, value): 
     try: 
      list.__setitem__(self, key, value) 
     except IndexError: 
      self.extend((key - len(self)) * [None] + [value]) 

>>> a = ExpandingList() 
>>> a[1] = 4 
>>> a 
[None, 4] 
>>> a[4] = 4 
>>> a 
[None, 4, None, None, 4] 

이 까다로운 일이 될 수도를 음수 인덱싱, 슬라이싱).

+0

Nice. 이것은 내가 파이썬에 대해 이해하고 기억하고 싶었던 것들이다. 그리고 중요한 것은 아니지만 슬라이스 처리가 쉬울 것이라고 생각합니다! endIndex가 목록 길이보다 큰 경우를 제외하고는 – Ian

1

저는 이것이 구현 된 고유 방식을 생각할 수 없습니다. 그 말은, 당신이 기대하는 것을 수행하는 함수를 만드는 것은 나쁜 생각이 아닙니다. 좋아

def insertWithAutoFill(the_list, index, new_item): 
    if index >= len(the_list): 
     for i in range(len(the_list), index): 
      the_list.append(None) 
     the_list.append(new_item) 
    else: 
     the_list[index] = new_item 

그리고 당신은 그것을 호출 것 : 다음 my_list

my_list = [1, 2, 3] 
insertWithAutoFill(my_list, 6, 23) 

를 지금 포함 : 당신이

[1, 2, 3, None, None, None, 23] 

있을 수 있습니다 대신 my_list[index] = value를 사용하여, 당신은 같은 것을 사용할 수 있습니다 특정 사항을 올바르게 점검하고 index이 제대로 사용되고 있는지 확인하기 위해 일부 사항을 조정하십시오. 이 minorly 테스트 및 특정 경우에 작동했지만 당신이 정말로 당신이 그런 구조를 정의 할 수 있습니다 필요한 경우 :

2

zch has already given a great answer,하지만 난

class MyList(list): 
    @property 
    def length(self): # for the example bracket notation 
     return len(self) 
    def __getitem__(self, key): # Fix GET 
     try: # assume permission 
      return list.__getitem__(self, key) 
     except (IndexError, TypeError): # "ask forgiveness" 
      pass # using pass to save indents as try was a return 
     if key == 'length': # example bracket notation for length getter 
      return self.length 
     try: # JavaScript doesn't care about number type and accepts 
      key = int(key) # strings, too, but Python req.s integers 
      return list.__getitem__(self, int(key)) 
     except (IndexError, ValueError): 
      pass 
     return None 
    def __setitem__(self, key, value): # Fix SET 
     try: 
      list.__setitem__(self, key, value) 
      return value # copy return behaviour 
     except (IndexError, TypeError): 
      pass 
     try: 
      key = int(key) # force int 
     except ValueError: 
      return # fail quietly? 
     if key < 0: # still throw for bad key 
      raise IndexError() 
     self.extend((key - len(self)) * [None]) # fill gap with None 
     self.append(value) # append new value 
     return value # copy return behaviour 

>>> a = MyList() 
>>> a[0] = 1 
>>> a[2] = 1 
>>> (a, a[3]) 
([1, None, 1], None) 
>>> (a.length, a['length']) 
(3, 3) 
+1

getter를위한 좋은 아이디어 :) 그리고 세터에서 추가 체크! – Ian

+1

니스,하지만 "용서를 요청, 권한이 아니라"방식으로 getter를 구현할 수도 있습니다 ('IndexError' 제외). 보다 일관된'TypeError'를 얻을 수 있습니다. 현재'a = MyList ([0]) '의 경우'a [1.0]'은'None'과'a [0.0]'을 반환합니다. – zch

+0

고맙습니다. @zch. 용서, 고정 수레 및 문자열, 대괄호 표기법 구현 예를 추가로 변경되었습니다.나는 반환이 setter에 거의하지 않는다는 것을 알고있다 그러나 나는 지금 막 자바 스크립트를 베꼈다. –