Python Version 3 Logo

[Python]ゼロ埋めされていない数字文字列を数値としてソートする

Python でゼロ埋めされていない文字列のコード値をソートする際に、文字列のコード値を数値としてソートする方法を説明します。

前提条件

  • Python : 3.8.2

通常のソート

通常のソートでは下記のように sorted() メソッドを使用すると思います。

rec = ['10', '20', '02', '01', '05']

print(sorted(rec))
# ['01', '02', '05', '10', '20']

ゼロ埋めされているとこんな感じでソートされます。
上記のように実装するとゼロ埋めされていない場合、下記のようになってしまいます。

rec = ['10', '20', '2', '1', '05']
print(sorted(rec))
# ['05', '1', '10', '2', '20']

文字列のソートだと最初に1文字目が比較され上記のようにソートされてしまいます。
処理としては正しいのですが、利用者からすると正しく並んでないように思われてしまいます。

文字列を数値としてソートする

そこでソート対象の文字列を数値としてソートします。

rec = ['10', '20', '2', '1', '05']
print(sorted(rec, key=int))
# ['1', '2', '05', '10', '20']

sorted() メソッドの引数 key に「 int 」を指定することで文字列を数値としてソートすることができます。

rec = ['10', '20', '2', '1', '05', 'a']
print(sorted(rec, key=int))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'a'

ちなみにソートの対象に数値に変換できない文字列が入っていると上記のようにエラーとなるので注意が必要です。

少数点でのソート

文字列が小数点を含む数値の場合、引数 keyint ではなく「 float 」を指定します。

rec = ['10.5', '20', '2.0', '2.5', '1.0', '05']
print(sorted(rec, key=float))
# ['1.0', '2.0', '2.5', '05', '10.5', '20']

最後に

コード値をソートする方法は色々あると思いますが、今回の実装方法も覚えておいて損はないと思います。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

モバイルバージョンを終了