バックグラウンド
Pythonに整数に変換したい文字列があります。通常、私は単に使用しますint
:
>>> int("123")
123
残念ながら、このメソッドは-?[0-9]+
(先頭または末尾の空白を削除した後)一致する文字列のみを受け入れるため、あまり堅牢ではありません。たとえば、小数点付きの入力は処理できません。
>>> int("123.45")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '123.45'
そしてそれは確かにこれを処理することができません:
>>> int("123abc?!")
一方、この動作は、Perl、PHP、そして謙虚なQBasicでさえ大騒ぎすることなく実現できます。
INT(VAL("123abc")) ' 123
質問
これがint
、Python でのこの「一般化された」作業における私の最短の取り組みです。元の文字列が含まれs
、結果が次のようになると想定すると、50バイトになりますi
。
n="";i=0
for c in s:
n+=c
try:i=int(n)
except:0
かなり単純ですが、try
/ except
ビットは醜くて長いです。それを短くする方法はありますか?
細部
回答は次のすべてを行う必要があります。
- の文字列から始め
s
ます。整数値で終了しますi
。 - 整数は、文字列内の最初の数字の連続です。それ以降のすべては無視されます。数字以外の後にある場合は他の数字も含まれます。
- 入力の先行ゼロは有効です。
- 有効な整数で始まらない文字列の値は
0
です。
次の機能が推奨されますが、必須ではありません。
-
数字の直前の単一の符号は整数を負にします。- 数値の前後の空白を無視します。
- Python 2または3でも同様に機能します。
(注:上記のコードは、これらの基準をすべて満たしています。)
テストケース
"0123" -> 123
"123abc" -> 123
"123.45" -> 123
"abc123" -> 0
"-123" -> -123 (or 0 if negatives not handled)
"-1-2" -> -1 (or 0 if negatives not handled)
"--1" -> 0
"" -> 0
やや関連:codegolf.stackexchange.com/questions/28783/…(ただし、入力は適切な形式の整数であることが明示的に述べられていました)。
—
DLosc
何を
—
orlp 2015年
"12abc3"
与えるべきですか?
@
—
DLosc
12
orlp- "123.45"
ケースに似ています。
(lambda(x)(or(parse-integer x :junk-allowed t)0))
(Common Lisp、49バイト)-組み込みなので、コメントとしてのみ投稿されます。
@coredump
—
DLosc
:junk-allowed
--ha、それは素晴らしいことです!多くの言語での答えが取るに足らないものであるという事実がなければ、これを一般的なゴルフの挑戦にしたでしょう。しかし、Lispに感謝します。:^)