Pythonでの一般化整数キャスト


8

バックグラウンド

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

1
何を"12abc3"与えるべきですか?
orlp 2015年

@ 12orlp- "123.45"ケースに似ています。
DLosc

(lambda(x)(or(parse-integer x :junk-allowed t)0))(Common Lisp、49バイト)-組み込みなので、コメントとしてのみ投稿されます。
コアダンプ2015年

1
@coredump :junk-allowed--ha、それは素晴らしいことです!多くの言語での答えが取るに足らないものであるという事実がなければ、これを一般的なゴルフの挑戦にしたでしょう。しかし、Lispに感謝します。:^)
DLosc

回答:


4

40バイト

import re;i=int("0"+re.split("\D",s)[0])

さらに、8文字のネガを実行できます。

import re;i=int((re.findall("^-?\d+",s)+[0])[0])

@DLoscああ、そうですね、2つ目は十分にテストしていません。'aha'の瞬間は、いくつかのPython正規表現関数がMatchObjectsではなく文字列を返すことに気づいたときでした
KSab

1
import re;i=int((re.findall("^-?\d+",s)+[0])[0])48バイトで動作します。
DLosc

6

Pythonの2、47、46

それは正規表現を使用するほど短くはありませんが、私は面白いことにあいまいであると思いました。

i=int(('0%sx'%s)[:~len(s.lstrip(str(1<<68)))])

KSabによる-1 – str一部の大きな整数ではL、末尾にを付けないため、repr演算子よりもうまく機能します。


2
str(1<<68)lstripの内部を使用してバイトを削ることができます
KSab

ワオ。面白くないのは正しいです!(これは負でない数のみを処理します、正しいですか?)
DLosc '27

@KSabの提案のもう1つのボーナスは、Python 3の互換性です。
DLosc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.