Mam możliwe ciągi takich jak:

20.99, 20, 20.12

Czasami ciąg może zostać wysłany do mnie błędnie przez użytkownika do czegoś takiego:

20.99.0, 20.0.0

Powinny one zostać przekształcone z powrotem do:

20.99, 20

Zasadniczo usuwając wszystko z drugiego. Jeśli jest jeden.

, aby być jasnym, byliby same, po jednym na raz, tak tylko jedna cena w jednym ciągach

Jakieś miłe pomysły w liniowce?

1
Harry 22 sierpień 2012, 11:10

5 odpowiedzi

Najlepsza odpowiedź

Dla jednej liniowej możesz użyć .split() i .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'
8
Blender 22 sierpień 2012, 07:14

Mógłbyś zrobić coś takiego

>>> 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']

Spójrz na wewnętrzną ekspresję znaleziska. Znajduję pierwszy "". i zwiększanie przez 1, a następnie znajdź następną "". I pozostawiając wszystko, od tego w operacji kromki ciągnącej.

3
Senthil Kumaran 22 sierpień 2012, 07:16

Edytuj: Należy zauważyć, że ten roztwór nie odrzuci wszystkiego od drugiego punktu dziesiętnego, ale wyrzucić tylko drugi punkt i utrzymywać dodatkowe cyfry. Jeśli chcesz odrzucić wszystkie cyfry, można użyć np. @ Rozwiązanie Blender's

Kwalifikuje się tylko jako jednowarstwowa, jeśli dwie instrukcje na linię z liczeniem ;, ale tutaj wymyśliłem:

>>> x = "20.99.1234"
>>> s = x.split("."); x = s[0] + "." +  "".join(s[1:])
>>> x
20.991234

Powinien być trochę szybszy niż skanowanie przez ciąg wielokrotnie. Aby uzyskać koszt wykonania, możesz to zrobić:

>>> x = x.split(".")[0] + "." +  "".join(x.split(".")[1:])

Dla całej listy:

>>> 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
Stefan Seemayer 22 sierpień 2012, 07:31
>>> 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'
1
Burhan Khalid 22 sierpień 2012, 07:24

Jeśli szukasz rozwiązania oparte na regex i zamierzone zachowaniem jest odrzucić wszystko po drugim {x0}} niż

>>> st = "20.99.123"
>>> string_decimal = re.findall(r'\d+\.\d+',st)
>>> float(''.join(string_decimal))
20.99
1
RanRag 22 sierpień 2012, 07:38