1. ホーム
  2. python

[解決済み] 文字列の自然並べ替えのための組み込み機能はありますか?

2022-03-15 09:12:26

質問

文字列のリストがあり、それに対して 自然なアルファベット順のソート .

例えば、次のリストは自然にソートされています(私が望むもの)。

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

そして、上記のリストのquot;sorted"バージョンです(quot;sorted"を使って得たものです)。 sorted() ):

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

のような挙動をするソート機能を探しています。

どのように解決するのですか?

このためのサードパーティライブラリが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 Explorerのようにソートするにはどうしたらよいですか? natsort バージョン7.1.0には os_sorted を使うと、まさにこのようなことができます。Windowsでは、Windowsエクスプローラと同じ順序でソートされ、他のOSでは、ローカルファイルシステムブラウザと同じ順序でソートされます。

>>> 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 ドキュメントを読んで、制限と最良の結果を得る方法を理解してください。