[python] Python의 표준 라이브러리에 정렬 된 컨테이너가없는 이유는 무엇입니까?

정렬 된 컨테이너가 Python에 추가되지 않도록하는 Python 설계 결정 (PEP)이 있습니까?

( OrderedDict은 삽입 순서로 정렬되어 있으므로 정렬 된 컨테이너가 아닙니다.)



답변

그것은 Guido의 의식적인 디자인 결정입니다 (그는 collections모듈 추가에 대해 다소 주저했습니다 ). 그의 목표는 응용 프로그램을위한 데이터 유형 선택과 관련하여 “한 가지 분명한 방법”을 유지하는 것입니다.

기본 개념은 사용자가 내장 유형이 문제에 대한 올바른 해결책이 아니라는 것을 인식 할만큼 충분히 정교하다면 적절한 타사 라이브러리를 찾는 작업에 달려 있다는 것입니다.

list + sorting, list + heapq 및 list + bisect가 본질적으로 정렬 된 데이터 구조에 의존하는 많은 사용 사례를 다루고 blist와 같은 패키지가 존재한다는 점을 감안할 때이 공간에 더 많은 복잡성을 추가 할 큰 드라이브는 없습니다. 표준 라이브러리.

어떤면에서 그것은 표준 라이브러리에 다차원 배열이 없다는 사실과 유사하며 대신 NumPy 사람들에게 그 작업을 넘깁니다.


답변

정렬 된 목록, dict 및 집합 유형을 구현 하는 python sortedcontainers 모듈 도 있습니다. blist와 매우 유사하지만 pure-Python으로 구현 되며 대부분의 경우 더 빠릅니다 .

>>> from sortedcontainers import SortedSet
>>> ss = SortedSet([3, 7, 2, 2])
>>> ss
SortedSet([2, 3, 7])

또한 다른 패키지에는 일반적이지 않은 기능이 있습니다.

>>> from sortedcontainers import SortedDict
>>> sd = SortedDict((num, num) for num in range(100000))
>>> sd.iloc[-5] # Lookup the fifth-to-last key.
99995

면책 조항 : 저는 sortedcontainers 모듈의 작성자입니다.


답변

도있다 blist의 포함 모듈 의 SortedSet의 데이터 유형 :

sortedset(iterable=(), key=None)

>>> from blist import sortedset
>>> my_set = sortedset([3,7,2,2])
sortedset([2, 3, 7]


답변

정확히 “정렬 된 컨테이너”는 아니지만 “삽입 후 목록을 정렬 할 필요없이 정렬 된 순서로 목록을 유지하는 지원을 제공하는” 표준 라이브러리의 bisect 모듈에 관심이있을 수 있습니다 .


답변

a는있다 heapq표준 라이브러리에서, 정확히하지만, 가지, 정렬되지 않습니다. 거기에 또한 blist의 패키지는하지만, 표준 라이브러리에 없습니다.


답변

파이썬 목록은 정렬되어 있습니다. 정렬하면 그대로 유지됩니다. Python 2.7에서는 OrderedDict명시 적으로 정렬 된 사전을 유지하기 위해 유형이 추가되었습니다.

파이썬에는 또한 집합 (멤버가 고유해야하는 컬렉션)이 있지만 정의에 따라 순서가 지정되지 않습니다. 집합을 정렬하면 list.


답변