電波ビーチ

☆(ゝω・)v

isnumeric, isdigit, isdecimalは負値に対応してなかった話

知らんかったです。ハマり記念

>>> lis = [str(x) for x in range(-3, 3)]
>>> lis
['-3', '-2', '-1', '0', '1', '2']
>>> for l in lis:
...     print(l if l.isnumeric() else 'Noooo!!!')
... 
Noooo!!!
Noooo!!!
Noooo!!!
0
1
2
>>> for l in lis:
...     print(l if l.isdigit() else 'Fuck!!!!')
... 
Fuck!!!!
Fuck!!!!
Fuck!!!!
0
1
2
>>> for l in lis:
...     print(l if l.isdecimal() else 'aaaaaaa!!!')
... 
aaaaaaa!!!
aaaaaaa!!!
aaaaaaa!!!
0
1
2

もちろん、lisが文字列ではなく数値の場合はこの限りではないのですが、文字列と数値(として扱いたいやつ)が混合した入力でふつうにinput().split()して得たようなやつだとンンンとなるので若干つらくなりました。

適当にreなりで対応する手もあるんでしょうが、正規表現思考コストが高い気がするので今回はわざわざ関数で判断しました(2019/01/01 正規表現版追記しました)。ラムダ式リテラルがアレで使えなくて残念。

>>> def isnum(a):
...     try:
...             int(a)
...     except:
...             return False
...     return True
... 
>>> for l in lis:
...     print(l if isnum(l) else 'くぁwせdrftgyふじこlp;')
... 
-3
-2
-1
0
1
2

ほかに良い方法があったら教えてください、という話でした。

以下追記(2019/01/01)。正規表現

import re
lis = [str(x) for x in range(-3, 3)]
for l in lis:
  print(int(l) if re.match('[+|-]?\d', l) else None)