2013-07-08 1 views
13

/C++, 우리가 할 수 :파이썬 목록/세트의 최대 길이를 설정하는 방법은 무엇입니까? C에서

maxnum = 10; 
double xlist[maxnum]; 

어떻게 파이썬 목록의 최대 길이를 설정/설정?

+0

결과 중. 그렇지 않으면 추가, 계속 정렬 후 요소를 삭제하는 것은 낭비입니다. – alvas

+2

한 가지 방법은 목록의 사용자 정의 클래스를 만들고 파이썬'list'에서 기능을 상속하는 것입니다. 그런 다음'add' (그리고 아마도 다른 것들) 메소드에서 최대 길이에 대한 검사를 추가하십시오. – stalk

+0

@stalk 당신은 답변으로 게시해야합니다. –

답변

18

당신은 필요 없으며 반드시 필요하지 않습니다.

파이썬 목록은 내용에 맞게 동적으로 커지거나 축소됩니다. 세트는 해시 테이블로 구현되며 Python 사전은 내용에 맞게 필요에 따라 동적으로 확장 및 축소됩니다.

아마 당신은 사용하거나 뭔가 (A maxlen 매개 변수를 사용하는) collections.deque 찾고 하였다 heapq 대신에 (당신이 최대에 도달 한 heapq.heappushpop() 사용)? 당신이 당신의 목록 lst가 있으면

+0

'dequeue'는 트릭을해야하는'maxlen' 속성을 가지고 있습니다. –

+0

사전이 줄어들거나, 오히려 오해의 소지가 있다고 생각합니다. 빈 dict를 만들 때'sys.getsizeof'는 148 바이트라고 알려줍니다. 백만 개의 항목을 추가 한 후에는 25165876 바이트입니다. 모든 항목을 터뜨린 후에도 여전히 25165876 바이트입니다. 또한'next (iter (d)) '를 시도해 보면 백만 항목을 추가 한 후에는 하나를 제외한 모든 항목을 터뜨린 후보다 약 3500 배 빠릅니다 (사실 어떻게 알았는지). –

+0

@StefanPochmann 무언가를 다시 추가 할 때까지 크기 조정이 연기됩니다 (IIRC). 정확한 트리거가 무엇인지 확인해야합니다. 나는 당신이 삭제 한 가장 일반적인 사용법에 종종 최적화 된 것을 추가하는 새로운 추가가 뒤 따른다는 것을 알고 있습니다. 따라서 삭제시 즉시 줄어들지 않습니다. –

6

, 당신은 10 개보다 많은 요소의 크기, 당신은 처음 10 개 요소에

if len(lst)>10: 
    lst = lst[:10] 

절단 할 수 있습니다.

+1

@ JonasR가 지적했듯이, 잘라 내기 전에'len (lst)'을 검사하는 것은 불필요합니다. – alvas

+0

나는 꽤 확신하지 못했습니다. 이 코드를 사용해보십시오 – octoback

+0

'x = [1,2,6]; x = x [: 2] len (x)> 2 else x'이면이 코드를 시도해보십시오. x = [1,2,6]; x [: 2] ' – alvas

2

목록, 세트는 본질적으로 동적이며 어떤 크기로 커질 수 있습니다.

파이썬은 C++가 아니며 파이썬은 동적 언어입니다. 세트 및 목록은 원하는 크기로 확장하거나 축소 할 수 있습니다.

x 최소 또는 최대 항목을 반복 가능하게하려는 경우 heapq 모듈을 사용하십시오.

heapq.nsmallest(n, iterable[, key]) 

복귀 반복 가능한 의해 정의 된 세트에서 N 작은 요소 목록. 키가 제공된 경우 이 반복 가능 항목의 각 요소에서 비교 키를 추출하는 데 사용되는 하나의 인수 함수를 지정합니다. key = str.lower 다음과 같습니다 : sorted (iterable, key = key) [: n]

bisect 또는 모듈 일 수

이 모듈은 각각의 삽입 후리스트 정렬 할 필요없이 정렬 된 순서 의 목록을 유지하기위한 지원을 제공한다.

그런 다음 자르기 또는 itertools.slice을 사용하여 목록에서 상위 x 항목을 가져옵니다.

10

다음은 파이썬의 list 확장 버전입니다. 그것은 list처럼 동작하지만, 길이는 (파이썬 2.7에서 시도)를 초과하면, BoundExceedError을 올릴 것이다 :

class BoundExceedError(Exception): 
    pass 


class BoundList(list): 
    def __init__(self, *args, **kwargs): 
     self.length = kwargs.pop('length', None) 
     super(BoundList, self).__init__(*args, **kwargs) 

    def _check_item_bound(self): 
     if self.length and len(self) >= self.length: 
      raise BoundExceedError() 

    def _check_list_bound(self, L): 
     if self.length and len(self) + len(L) > self.length: 
      raise BoundExceedError() 

    def append(self, x): 
     self._check_item_bound() 
     return super(BoundList, self).append(x) 

    def extend(self, L): 
     self._check_list_bound(L) 
     return super(BoundList, self).extend(L) 

    def insert(self, i, x): 
     self._check_item_bound() 
     return super(BoundList, self).insert(i, x) 

    def __add__(self, L): 
     self._check_list_bound(L) 
     return super(BoundList, self).__add__(L) 

    def __iadd__(self, L): 
     self._check_list_bound(L) 
     return super(BoundList, self).__iadd__(L) 

    def __setslice__(self, *args, **kwargs): 
     if len(args) > 2 and self.length: 
      left, right, L = args[0], args[1], args[2] 
      if right > self.length: 
       if left + len(L) > self.length: 
        raise BoundExceedError() 
      else: 
       len_del = (right - left) 
       len_add = len(L) 
       if len(self) - len_del + len_add > self.length: 
        raise BoundExceedError() 
     return super(BoundList, self).__setslice__(*args, **kwargs) 

사용 : 내가 최고 X 번호로 내 욕심 검색을 제한 할 수 있도록

>>> l = BoundList(length=10) 
>>> l.extend([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 
>>> l 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> # now all these attempts will raise BoundExceedError: 
>>> l.append(11) 
>>> l.insert(0, 11) 
>>> l.extend([11]) 
>>> l += [11] 
>>> l + [11] 
>>> l[len(l):] = [11] 
+0

라이브러리 등을 가져와야합니까? – alvas

+1

아니요,이 코드에는 종속성이 없습니다. – stalk