ほぼ週刊ハマりどころメモ

画像認識と自然言語処理を研究する中でハマったところを共有します.ほぼ自分用のメモ.

Pythonのsortで1の次に10がくる問題

下のリストがあったとき,sortを使って昇順に並び替えを行うと,困ったことが起きる.

list1 = ["1","10","3","22","23","4","2","200"]
list1.sort()
list1
>> ['1', '10', '2', '200', '22', '23', '3', '4']

そう,1の次に2が来ず,10が来てしまうのだ...

この問題を回避するには,

list1 = ["1","10","3","22","23","4","2","200"]
list1.sort(key=int)
list1
>> ['1', '2', '3', '4', '10', '22', '23', '200']

とすれば良いようだ.

stackoverflow.com

だけど,ファイル名の先頭に付いた番号順にソートしたいときには,この方法は使えない.

list1 = ["1_a","10_a","3_a","22_b","23_b","4_c","2_c","200_d"]
list1.sort(key=int)
>>Traceback (most recent call last):

  File "<ipython-input-9-bd2e95a2a652>", line 1, in <module>
    list1.sort(key=int)

ValueError: invalid literal for int() with base 10: '1_a'

自分で関数をゴリゴリ書くしかないのか...

もっとスマートな方法は無いのかなー?