1

私は次のような価格の可能な文字列を持っています:

20.99, 20, 20.12

時々、文字列がユーザーによって次のようなものに誤って送信される可能性があります。

20.99.0, 20.0.0

これらは次のように変換する必要があります:

20.99, 20

つまり、基本的に2番目から何かを削除します。ある場合。

明確にするために、それらは一度に1つずつだけであるため、1つの文字列に1つの価格しかありません

素敵なワンライナーのアイデアはありますか?

4

5 に答える 5

8

ワンライナーの場合、次を使用でき.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'
于 2012-08-22T07:14:56.403 に答える
3

あなたはこのようなことをすることができます

>>> 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ずつインクリメントしてから、次の「。」を見つけます。それからすべてを文字列スライス操作に残します。

于 2012-08-22T07:16:16.727 に答える
2

編集:このソリューションは小数点以下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]
于 2012-08-22T07:17:07.833 に答える
1

正規表現ベースのソリューションを探していて、意図した動作が2番目以降のすべてを破棄することである.(decimal)場合

>>> st = "20.99.123"
>>> string_decimal = re.findall(r'\d+\.\d+',st)
>>> float(''.join(string_decimal))
20.99
于 2012-08-22T07:21:36.673 に答える
1
>>> 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'
于 2012-08-22T07:24:39.407 に答える