文字列の自然なソートのための組み込み関数はありますか? 質問する

文字列の自然なソートのための組み込み関数はありますか? 質問する

実行したい文字列のリストがあります自然なアルファベット順

たとえば、次のリストは自然にソートされています(私が望んでいるもの)。

['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

そして、これが上記のリストの「ソートされた」バージョンです(私が使用したものはsorted()):

['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']

最初のものと同じように動作するソート関数を探しています。

ベストアンサー1

PyPIにはこれ用のサードパーティライブラリがあります。ナソート(完全な開示として、私はこのパッケージの作成者です)。あなたの場合は、次のいずれかを実行できます。

>>> from natsort import natsorted, ns
>>> x = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
>>> natsorted(x, key=lambda y: y.lower())
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
>>> natsorted(x, alg=ns.IGNORECASE)  # or alg=ns.IC
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

natsort一般的なアルゴリズムを使用しているので、どのような入力に対しても機能するはずです。独自の関数を作成するのではなく、ライブラリを選択する理由について詳しく知りたい場合は、ドキュメントをご覧natsortください。使い方ページ、特にどこにでも特別なケースが!セクション。


並べ替え関数ではなく並べ替えキーが必要な場合は、以下のいずれかの式を使用します。

>>> from natsort import natsort_keygen, ns
>>> l1 = ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
>>> l2 = l1[:]
>>> natsort_key1 = natsort_keygen(key=lambda y: y.lower())
>>> l1.sort(key=natsort_key1)
>>> l1
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
>>> natsort_key2 = natsort_keygen(alg=ns.IGNORECASE)
>>> l2.sort(key=natsort_key2)
>>> l2
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']

2020年11月更新

「Windowsエクスプローラー(またはオペレーティングシステムのファイルシステムブラウザ)のように並べ替えるにはどうしたらいいですか?」というリクエストや質問がよくあるので、natsortバージョン7.1.0では、os_sortedまさにこれを実行します。Windows では、Windows エクスプローラーと同じ順序で並べ替えられ、他のオペレーティング システムでは、ローカル ファイル システム ブラウザーと同じように並べ替えられます。

>>> from natsort import os_sorted
>>> os_sorted(list_of_paths)
# your paths sorted like your file system browser

ソートキーが必要な場合は、 を使用できますos_sort_keygen(または、os_sort_keyデフォルトだけが必要な場合)。

注意- 制限事項と最良の結果を得る方法を理解するために、使用する前にこの関数の API ドキュメントをお読みください。

おすすめ記事