web-dev-qa-db-ja.com

Pythonのsorted()関数は安定していることが保証されていますか?

ドキュメント はそれを保証しません。文書化されている他の場所はありますか?

リストのソート方法は 安定することが保証されている (注9番目のポイント:「Python 2.3、sort()メソッドは安定していることが保証されています」)、並べ替えは機能的に似ています。しかし、そう言う決定的なソースを見つけることができません。

目的:主キーが両方のレコードで等しい場合、主キーと二次キーに基づいてソートする必要があります。 sort()の安定性が保証されている場合、2次キーでソートし、1次キーでソートして必要な結果を取得できます。

PS:混乱を避けるために、「等しいと比較する要素の相対的な順序を変更しないことが保証されている場合、ソートは安定している」という意味で、stableを使用しています。

80
sundar

はい、マニュアルの意図は、実際にsortedが安定し、実際にsortメソッドとまったく同じアルゴリズムを使用することを保証することです。私はドキュメントがこのアイデンティティについて100%明確ではないことを理解しています。 docパッチは常に喜んで受け入れられます!

105
Alex Martelli

それらは stable です。

ちなみに、マルチパスソートをシングルパスソートに組み合わせることで、ソートとソートが安定しているかどうかを無視することがあります。

たとえば、last_namefirst_name属性に基づいてオブジェクトを並べ替える場合、1回のパスでそれを実行できます。

sorted_list= sorted(
    your_sequence_of_items,
    key= lambda item: (item.last_name, item.first_name))

タプル比較を利用します。

この回答は、元の質問をそのままカバーしています。さらにソート関連の質問については、 Python Sorting How-To があります。

23
tzot