本記事の概要
本記事は数字を扱うときに整数型,文字列型どっちで扱うのかを注意しない自分が困りますよという内容です.
早めの結論
- ソート順が異なります
- 言語によって等価演算の扱いが異なります
注意1: ソート順
# リスト
int_list = [i for i in range(20)] # 整数型のリスト
str_list = [str(s) for s in range(20)] # 文字列型のリスト
# ソート
int_list = sorted(int_list)
str_list = sorted(str_list)
ソート順確認
print(int_list)
print(str_list)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
# ['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '3', '4', '5', '6', '7', '8', '9']
上記の通り,文字列型の場合は「1」の後に「10」が来ます.
文字列の比較は,先頭から見比べて,等価の場合は次の文字を比較です.
具体例はこちらです.
print(max(110, 11)) # 110
print(max('110', '11')) # '110' (2文字目まで等価で,3文字目が'0'と''なので)
print(max(110, 13)) # 110
print(max('110', '13')) # '13' (1文字目まで等価で,2文字目が'1'と'3'なので)
このように,ソート順が異なるので型を誤ると意図しない挙動になります.注意が必要です.
ゼロパディング
先ほど見たように,数値型と数字文字列ではソート順が異なりました.
でも数字文字列で扱いたいし,ソート順も数値型と同じになって欲しい事もあります.
そこでゼロパディング(0 埋め)です.
「'1'」を「'001'」のように扱います.
それによってソート順が数値型と同じになります.
では具体例を見てみましょう.
下記ではzfill(3)
で 3 桁数になるように 0 埋めしています.
# リスト
str_list = [str(s) for s in range(20)] # 文字列型のリスト
str_zfill_list = [str(s).zfill(3) for s in range(20)] # 文字列型のリスト(ゼロパディング)
# ソート
str_list = sorted(str_list)
str_zfill_list = sorted(str_zfill_list)
ソート順確認
['0', '1', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '3', '4', '5', '6', '7', '8', '9']
['000', '001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012', '013', '014', '015', '016', '017', '018', '019']
注意2: 等価演算
Pythonの等価演算は以下の挙動になります.
print(1 == '1') # False
ここでJavaScriptの挙動を見てみましょう.
console.log(1 == '1'); // true
console.log(1 === '1'); // false
上記のように,言語によって整数型と文字列型を「=
=」演算子で比較したときの挙動が異なります.
注意しましょう.