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


83

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

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


1
collections.OrderedDictのように?
utdemir 2011年

1
それはただ速いです。ハッシュマップのO(1)と順序集合のO(log n)。
vartec 2011年

19
@utdmr:OrderedDictは、ソートされたコンテナーのように任意のキーではなく、挿入順序でソートされます。
ニールG

1
@ Hi-Angelいいえ、それはソートされたコンテナが意味するものではありません。 例えば
ニールG

1
「ソートされたコンテナは、挿入時に要素をソートするコンテナです」。正確ではありません。ソートされたコンテナとは、インターフェイスが(任意のキーに従って)効率的にソートされた反復と検索を行うコンテナであると言えます。あなたの誤解はあなたの変わった定義から生じます。
ニール

回答:


77

これはGuido側の意識的な設計上の決定です(彼はcollectionsモジュールの追加に関していくらか気が進まなかった)。彼の目標は、アプリケーションのデータ型の選択に関して、「それを行うための1つの明白な方法」を維持することです。

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

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

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


2
おかげで、私はこの設計決定の背後にある動機を探していました。これはまさに私が探していた種類の答えです。私の最初の本能はこのように物事を行うことではなかったでしょうが、議論は非常に説得力があります。
ニールG

collections.Counterソートされたセットとして使用できます。効率的ではないかもしれませんが。
coderek 2017年

1
@coderek:collections.Counterソートされていないため、ソートされたセットを表すには適していません。
user2357112は、Monicaをサポートします2018

しかし、少なくとも組み込みの辞書をソートするべきではありませんか?要素への高速アクセスを提供するために、辞書はソートされた状態で保存する必要があります。これを繰り返すと、どういうわけかソートされていないアイテムになってしまうのは奇妙に思えます。
ハイエンジェル

1
@ Hi-Angeldictはハッシュテーブルです。
ニール

82

ソートされたリスト、dict、およびセットタイプを実装するPythonのsortedcontainersモジュールもあります。これはblistと非常に似ていますが、純粋な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モジュールの作成者です。


1
いいね!ドキュメントを更新して、基になるストレージがロープであることを指定することを検討することをお勧めします。
ニールG

1
@NeilGありがとう!カップルノート:blistは純粋なPythonで書かれていません。ソートされたセット、リスト、およびdictタイプは、Cで実装されたB +ツリーであるblistタイプに基づいています。また、基礎となる構造は実際にはロープではありません。B +ツリーに似ていますが、ノードのレベルは1つだけです。
GrantJ 2014年

3
これは実際、big-Oが誤解を招く可能性があることを示す良い例です。おそらく1兆要素程度遅くなるでしょうが、ほとんどの人はそれを心配するためのテラバイトのメモリを持っていません。私はそれを数十億の要素でテストし、C実装と同じくらい高速でした。また、このような単純なリストベースの構造を維持することにより、使用するメモリがはるかに少なくなります。
GrantJ 2014年

1
ええ、絶対に。これは、文字列、特にエディタで使用される長い文字列にこの種のデータ構造を使用することを正当化するために使用するのと同じ引数です。
ニールG

2
とにかく、これを書いてくれてありがとう。このデータ構造が必要な場合は、この点に注意します。
ニールG


5

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


1

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


-2

Pythonリストは順序付けられています。あなたがそれらを分類するならば、彼らはそのようにとどまります。Python 2.7ではOrderedDict、明示的に順序付けられた辞書を維持するために型が追加されました。

Pythonにもセット(メンバーが一意である必要があるコレクション)がありますが、定義上、それらは順序付けられていません。セットをソートすると、が返されますlist


8
お時間を割いていただきありがとうございます。OrderedDictは、ソートされたコンテナーのような任意のキーではなく、挿入順序でソートされます。セットもソートされたコンテナではありません。
ニールG

1
btreeはおそらくあなたが探しているものですか?stackoverflow.com/questions/628192#628432
jathanism 2011年

おかげで、btreeはまさに私が探していたようなものです。blistはMacPortsにあり、便利なデータ構造がたくさんあるので、blistを使用します。
ニールG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.