[解決済み] 文字列の自然並べ替えのための組み込み機能はありますか?
質問
文字列のリストがあり、それに対して 自然なアルファベット順のソート .
例えば、次のリストは自然にソートされています(私が望むもの)。
['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 ドキュメントを読んで、制限と最良の結果を得る方法を理解してください。
関連
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] オブジェクトの現在のプロパティと値をすべて表示する組み込み関数はありますか?
-
[解決済み] カスタムオブジェクトのArrayListをプロパティでソートする
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] オブジェクトの属性に基づいてオブジェクトのリストを並べ替えるには?
-
[解決済み] String表現のDictionaryをDictionaryに変換する?
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python call matlab メソッドの詳細
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
任意波形を生成してtxtで保存するためのPython実装
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み] 数字を含む文字列を正しくソートするには?重複