[Tutor] one line code

Gregor Lingl glingl at aon.at
Tue Apr 5 16:27:29 CEST 2005


Pierre Barbier de Reuille schrieb:
> Mmmhhh ... not strictly one line but ...
> 
> import re
> 
> float_str = re.compile(r"^\s*[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?\s*$")
> 
> val = [ ( (float_str.match(s) and [float(s)]) or [s])[0] for s in l2 ]
> 
> It's not really "readable" but well ... it works ^_^
> 
> Pierre
> 

This can be done in strictly 1 line (having already imported re):

 >>> l = ['1','2','3','abc','0', '','4']
 >>> [(re.match(r"^\s*[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?\s*$",s) 
and [float(s)] or [s])[0] for s in l]
[1.0, 2.0, 3.0, 'abc', 0.0, '', 4.0]

or, if one doesn't have to take into account exponential format:

 >>> [(x and not[y for y in x if y not in "0123456789."] and 
x.count(".")<2 and [float(x)] or [x])[0] for x in l]
[1.0, 2.0, 3.0, 'abc', 0.0, '', 4.0]
 >>>

hmmm, unfortunately "Useless Python" isn't maintained anymore...

(^o^)

Gregor


More information about the Tutor mailing list