Python: Convertir cadena en número decimal

4 minutos de lectura

Avatar de usuario de Sankar A
Sankar A

Tengo una lista de python con cadenas en este formato:

A1 = [' "29.0" ',' "65.2" ',' "75.2" ']

¿Cómo convierto esas cadenas en números decimales para realizar operaciones aritméticas en los elementos de la lista?

Avatar de usuario de Mark Byers
marca byers

Si desea que el resultado sea el número de punto flotante binario más cercano, use float:

result = [float(x.strip(' "')) for x in A1]

Si desea que el resultado se almacene exactamente, use Decimal en vez de float:

from decimal import Decimal
result = [Decimal(x.strip(' "')) for x in A1]

  • Probé esto y me di cuenta de que no funciona porque las cadenas tienen espacios en blanco y comillas adicionales.

    – jake

    10 de enero de 2011 a las 5:46

Avatar de usuario de Nids Barthwal
Nids Barthwal

Si está convirtiendo el precio (en cadena) a precio decimal, entonces…

from decimal import Decimal

price = "14000,45"
price_in_decimal = Decimal(price.replace(',','.'))

No es necesario reemplazar si sus cadenas ya usan puntos como separador decimal

  • ¿Este método no pierde los últimos 2 lugares decimales, lo que da como resultado un número mayor?

    – tehfink

    5 de agosto de 2018 a las 15:32

  • price_in_decimal = Decimal(price.replace(',','.')) Esto es lo que @Nids pretendía, supongo. Reemplazando el , con .

    – corredor libre

    17 de septiembre de 2018 a las 9:51


  • @freerunner exactamente!

    – Víctor

    8 de marzo de 2020 a las 7:14

Tendrás que usar strip() debido a los bits adicionales en las cadenas.

A2 = [float(x.strip('"')) for x in A1]

  • También debe eliminar el espacio adicional.

    – DSM

    10 de enero de 2011 a las 5:47

  • ¿Probado con un cortar y pegar del ejemplo del OP? No funcionó como está.

    –Mark Tolonen

    10 de enero de 2011 a las 6:47

  • @Mark, no tengo idea de qué hice de manera diferente ayer, pero ahora no funciona. Quizás la pregunta ha sido editada desde que la copié.

    – jake

    10 de enero de 2011 a las 22:05

use la función float() incorporada en una lista de comprensión.

A2 = [float(v.replace('"','').strip()) for v in A1]

En Python hay dos tipos de datos de punto flotante Float y Decimal. El caso de uso depende de la precisión del decimal que desee en su programa. Float es rápido y Decimal es preciso

Para convertir una cadena en un número de coma flotante, simplemente haga

import decimal
float('1.2')
decimal.Decimal('1.2')

analizando Float y Decimal objetos

>>> import sys
>>> from decimal import Decimal

>>> num = '1.2'

>>> float(num)
1.2

>>> Decimal(num)
Decimal('1.2')


>>> # Precision
>>> float(1.2)
1.2

>>> Decimal(1.2)
Decimal('1.1999999999999999555910790149937383830547332763671875')


>>> # Memory usage
>>> sys.getsizeof(Decimal(num))
104

>>> sys.getsizeof(float(num))
24


>>> # Performance
>>> %timeit float(num)
140 ns ± 2.27 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

>>> %timeit Decimal(num)
192 ns ± 9.42 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

En su caso particular, puede usar la solución @Mark Byers.

avatar de usuario de tekknolagi
teknolagi

A2 = [float(x.strip('"')) for x in A1] funciona, @Jake, pero hay ceros innecesarios

Avatar de usuario de Ruhul Amin
ruhul amin

Hay dos tipos de datos de coma flotante. Float y Decimal. Depende de la demanda de su programa cuál desea utilizar. Decimal proporciona un alto nivel de precisión y es más preciso que Float.

Para convertir una cadena de valor en flotante, simplemente hágalo:

num = "29.0"
print (float(num))

Para convertir cadenas a decimales

from decimal import Decimal
num = "29.0"
print (Decimal(num))

Para su pregunta específica, puede usar el siguiente código. Ambos están trabajando para mí.

from decimal import Decimal
import re

result = [float(x.strip(' "')) for x in A1]
print(result)
#[29.0, 65.2, 75.2]


result = [Decimal(x.strip(' "')) for x in A1]
print(result)
#[Decimal('29.0'), Decimal('65.2'), Decimal('75.2')]


result = [float(re.search(r'\d+.\d+',number).group()) for number in A1]
print(result)
#[29.0, 65.2, 75.2]

result = [Decimal(re.search(r'\d+.\d+',number).group()) for number in A1]
print(result)
#[Decimal('29.0'), Decimal('65.2'), Decimal('75.2')]

¿Ha sido útil esta solución?