/C++, 우리가 할 수 :파이썬 목록/세트의 최대 길이를 설정하는 방법은 무엇입니까? C에서
maxnum = 10;
double xlist[maxnum];
어떻게 파이썬 목록의 최대 길이를 설정/설정?
/C++, 우리가 할 수 :파이썬 목록/세트의 최대 길이를 설정하는 방법은 무엇입니까? C에서
maxnum = 10;
double xlist[maxnum];
어떻게 파이썬 목록의 최대 길이를 설정/설정?
당신은 필요 없으며 반드시 필요하지 않습니다.
파이썬 목록은 내용에 맞게 동적으로 커지거나 축소됩니다. 세트는 해시 테이블로 구현되며 Python 사전은 내용에 맞게 필요에 따라 동적으로 확장 및 축소됩니다.
아마 당신은 사용하거나 뭔가 (A maxlen
매개 변수를 사용하는) collections.deque
찾고 하였다 heapq
대신에 (당신이 최대에 도달 한 heapq.heappushpop()
사용)? 당신이 당신의 목록 lst
가 있으면
'dequeue'는 트릭을해야하는'maxlen' 속성을 가지고 있습니다. –
사전이 줄어들거나, 오히려 오해의 소지가 있다고 생각합니다. 빈 dict를 만들 때'sys.getsizeof'는 148 바이트라고 알려줍니다. 백만 개의 항목을 추가 한 후에는 25165876 바이트입니다. 모든 항목을 터뜨린 후에도 여전히 25165876 바이트입니다. 또한'next (iter (d)) '를 시도해 보면 백만 항목을 추가 한 후에는 하나를 제외한 모든 항목을 터뜨린 후보다 약 3500 배 빠릅니다 (사실 어떻게 알았는지). –
@StefanPochmann 무언가를 다시 추가 할 때까지 크기 조정이 연기됩니다 (IIRC). 정확한 트리거가 무엇인지 확인해야합니다. 나는 당신이 삭제 한 가장 일반적인 사용법에 종종 최적화 된 것을 추가하는 새로운 추가가 뒤 따른다는 것을 알고 있습니다. 따라서 삭제시 즉시 줄어들지 않습니다. –
목록, 세트는 본질적으로 동적이며 어떤 크기로 커질 수 있습니다.
파이썬은 C++가 아니며 파이썬은 동적 언어입니다. 세트 및 목록은 원하는 크기로 확장하거나 축소 할 수 있습니다.
x 최소 또는 최대 항목을 반복 가능하게하려는 경우 heapq 모듈을 사용하십시오.
heapq.nsmallest(n, iterable[, key])
복귀 반복 가능한 의해 정의 된 세트에서 N 작은 요소 목록. 키가 제공된 경우 이 반복 가능 항목의 각 요소에서 비교 키를 추출하는 데 사용되는 하나의 인수 함수를 지정합니다. key = str.lower 다음과 같습니다 : sorted (iterable, key = key) [: n]
bisect 또는 모듈 일 수
이 모듈은 각각의 삽입 후리스트 정렬 할 필요없이 정렬 된 순서 의 목록을 유지하기위한 지원을 제공한다.
그런 다음 자르기 또는 itertools.slice
을 사용하여 목록에서 상위 x 항목을 가져옵니다.
다음은 파이썬의 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]
결과 중. 그렇지 않으면 추가, 계속 정렬 후 요소를 삭제하는 것은 낭비입니다. – alvas
한 가지 방법은 목록의 사용자 정의 클래스를 만들고 파이썬'list'에서 기능을 상속하는 것입니다. 그런 다음'add' (그리고 아마도 다른 것들) 메소드에서 최대 길이에 대한 검사를 추가하십시오. – stalk
@stalk 당신은 답변으로 게시해야합니다. –