私は次のような価格の可能な文字列を持っています:
20.99, 20, 20.12
時々、文字列がユーザーによって次のようなものに誤って送信される可能性があります。
20.99.0, 20.0.0
これらは次のように変換する必要があります:
20.99, 20
つまり、基本的に2番目から何かを削除します。ある場合。
明確にするために、それらは一度に1つずつだけであるため、1つの文字列に1つの価格しかありません
素敵なワンライナーのアイデアはありますか?
ワンライナーの場合、次を使用でき.split()
ます.join()
:
>>> '.'.join('20.99.0'.split('.')[:2])
'20.99'
>>> '.'.join('20.99.1231.23'.split('.')[:2])
'20.99'
>>> '.'.join('20.99'.split('.')[:2])
'20.99'
>>> '.'.join('20'.split('.')[:2])
'20'
あなたはこのようなことをすることができます
>>> s = '20.99.0, 20.0.0'
>>> s.split(',')
['20.99.0', ' 20.0.0']
>>> map(lambda x: x[:x.find('.',x.find('.')+1)], s.split(','))
['20.99', ' 20.0']
findの内部表現を見てください。私は最初の「。」を見つけています。1ずつインクリメントしてから、次の「。」を見つけます。それからすべてを文字列スライス操作に残します。
編集:このソリューションは小数点以下2桁目からすべてを破棄するのではなく、2桁目のみを破棄し、追加の桁を保持することに注意してください。すべての数字を破棄したい場合は、たとえば@Blenderのソリューションを使用できます
1行に2つの命令がカウントされている場合にのみ、ワンライナーとしての資格;
がありますが、私が思いついたのは次のとおりです。
>>> x = "20.99.1234"
>>> s = x.split("."); x = s[0] + "." + "".join(s[1:])
>>> x
20.991234
ただし、文字列を複数回スキャンするよりも少し速いはずです。パフォーマンスコストについては、次のように実行できます。
>>> x = x.split(".")[0] + "." + "".join(x.split(".")[1:])
リスト全体について:
>>> def numify(x):
>>> s = x.split(".")
>>> return float( s[0] + "." + "".join(s[1:]))
>>> x = ["123.4.56", "12.34", "12345.6.7.8.9"]
>>> [ numify(f) for f in x ]
[123.456, 12.34, 12345.6789]
正規表現ベースのソリューションを探していて、意図した動作が2番目以降のすべてを破棄することである.(decimal)
場合
>>> st = "20.99.123"
>>> string_decimal = re.findall(r'\d+\.\d+',st)
>>> float(''.join(string_decimal))
20.99
>>> s = '20.99, 20, 20.99.23'
>>> ','.join(x if x.count('.') in [1,0] else x[:x.rfind('.')] for x in s.split(','))
'20.99, 20, 20.99'