veo que ya hay varias buenas respuestas aquí, pero he tenido buena suerte con esto. También tiene la ventaja de que tolerará cadenas que no sean fracciones si está analizando conjuntos mixtos de datos, por lo que no es necesario verificar si se trata de una cadena de fracciones o no.
def convert_to_float(frac_str):
try:
return float(frac_str)
except ValueError:
try:
num, denom = frac_str.split('/')
except ValueError:
return None
try:
leading, num = num.split(' ')
except ValueError:
return float(num)/float(denom)
if float(leading) < 0:
sign_mult = -1
else:
sign_mult = 1
return float(leading) + sign_mult * (float(num)/float(denom))
>>> convert_to_float('3')
3.0
>>> convert_to_float('1/4')
0.25
>>> convert_to_float('1 2/3')
1.6666666666666665
>>> convert_to_float('-2/3')
-0.6666666666666666
>>> convert_to_float('-3 1/2')
-3.5
Algunas de estas otras soluciones de trabajo también, pero éste parece el más elegante. ¡Funciona genial! Gracias una tonelada. – mpen
No solo más elegante, sino también la más precisa –
Como señaló la respuesta de Shnaader, tenga cuidado con los signos negativos. – jprete