web-dev-qa-db-ja.com

Pythonの標準ライブラリにソートされたコンテナがないのはなぜですか?

ソートされたコンテナをPythonに追加できないようにするPython設計決定(PEP)はありますか?

OrderedDictは、挿入順に並べられているため、ソートされたコンテナではありません。)

68
Neil G

これは、Guido側の意識的な設計上の決定です(彼はcollectionsモジュールの追加に関して、いくぶん消極的でした)。彼の目標は、アプリケーションのデータ型の選択に関して、「1つの明白な方法」を保持することです。

基本的な概念は、組み込み型が問題の適切な解決策ではないことをユーザーが十分に理解している場合、適切なサードパーティライブラリを見つけることもできるということです。

List + sorting、list + heapq、list + bisectは、本来はソートされたデータ構造に依存する多くのユースケースをカバーし、blistのようなパッケージが存在することを考えると、このスペースにさらに複雑さを追加する大きなドライブはありません標準ライブラリ。

いくつかの点で、標準ライブラリに多次元配列がないという事実に似ていますが、代わりにそのタスクをNumPyの人々に委ねています。

63
ncoghlan

また、python sortedcontainers ソート済みリスト、dict、およびセットタイプを実装するモジュールもあります。blistと非常に似ていますが、で実装されていますpure-Pythonおよびほとんどの場合 faster

>>> 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モジュールの著者です。

67
GrantJ

sortedset データ型を含む blist モジュールもあります。

sortedset(iterable=(), key=None)

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

正確には「ソートされたコンテナ」ではありませんが、標準ライブラリの bisect モジュールに興味があるかもしれません。このモジュールは、「挿入ごとにリストをソートすることなくリストをソート順に維持するサポートを提供します」。

4
Steven

標準ライブラリにはheapqがありますが、正確にはソートされていませんが、種類は異なります。 blist パッケージもありますが、標準ライブラリにはありません。

1
abbot