Tengo un código de Python que se ejecuta a través de una lista de cadenas y, si es posible, las convierte a números enteros o números de coma flotante. Hacer esto para enteros es bastante fácil
if element.isdigit():
newelement = int(element)
Los números de coma flotante son más difíciles. En este momento estoy usando partition('.')
para dividir la cadena y comprobando que uno o ambos lados sean dígitos.
partition = element.partition('.')
if (partition[0].isdigit() and partition[1] == '.' and partition[2].isdigit())
or (partition[0] == '' and partition[1] == '.' and partition[2].isdigit())
or (partition[0].isdigit() and partition[1] == '.' and partition[2] == ''):
newelement = float(element)
Esto funciona, pero obviamente la declaración if para eso es un poco difícil. La otra solución que consideré es simplemente envolver la conversión en un bloque try / catch y ver si tiene éxito, como se describe en esta pregunta .
¿Alguien tiene alguna otra idea? ¿Opiniones sobre los méritos relativos de la partición y los enfoques try / catch?
fuente
Método de Python para verificar el flotador:
¡No te muerdas por los duendes que se esconden en el bote flotante! HAGA LAS PRUEBAS DE LA UNIDAD!
Lo que es y no es un flotador puede sorprenderte:
fuente
isfloat(" 1.23 ")
yisfloat(" \n \t 1.23 \n\t\n")
. Útil en solicitudes web; No es necesario recortar espacios en blanco primero.que volverá
true
solo si hay uno o no '.' en la cadena de dígitos.volverá
false
volverá
false
fuente
[i for i in df[i].apply(lambda x: str(x).replace('.','').isdigit()).any()]
TL; DR :
try: except:
método es el mejor método nativo de Python.Hay otro método disponible a través de un módulo de terceros llamado números rápidos (divulgación, yo soy el autor); Proporciona una función llamada isfloat . Tomé el ejemplo de prueba de unidad descrito por Jacob Gabrielson en esta respuesta , pero agregué el
fastnumbers.isfloat
método. También debo tener en cuenta que el ejemplo de Jacob no hizo justicia a la opción regex porque la mayor parte del tiempo en ese ejemplo se gastó en búsquedas globales debido al operador de punto ... He modificado esa función para hacer una comparación más justatry: except:
.En mi máquina, el resultado es:
Como puede ver, la expresión regular no es tan mala como parecía originalmente, y si tiene una verdadera necesidad de velocidad, el
fastnumbers
método es bastante bueno.fuente
Si le importaba el rendimiento (y no estoy sugiriendo que debería hacerlo), el enfoque basado en intentos es el claro ganador (en comparación con su enfoque basado en particiones o el enfoque regexp), siempre que no espere mucho cadenas no válidas, en cuyo caso es potencialmente más lento (presumiblemente debido al costo del manejo de excepciones).
Nuevamente, no estoy sugiriendo que se preocupe por el rendimiento, solo le doy los datos en caso de que esté haciendo esto 10 mil millones de veces por segundo, o algo así. Además, el código basado en particiones no maneja al menos una cadena válida.
Aquí está el código (Python 2.6, regexp tomado de la respuesta de John Gietzen ):
fuente
Solo por variedad, aquí hay otro método para hacerlo.
Editar: estoy seguro de que no resistirá todos los casos de flotación, especialmente cuando hay un exponente. Para resolver eso se ve así. Esto devolverá Verdadero solo val es flotante y Falso para int pero probablemente sea menos eficaz que regex.
fuente
Esta expresión regular verificará los números científicos de coma flotante:
Sin embargo, creo que su mejor opción es usar el analizador en un intento.
fuente
Si no necesita preocuparse por las expresiones científicas u otras expresiones de números y solo está trabajando con cadenas que podrían ser números con o sin punto:
Función
Versión lambda
Ejemplo
De esta manera, no está convirtiendo accidentalmente lo que debería ser un int, en un flotante.
fuente
Versión simplificada de la función
is_digit(str)
, que es suficiente en la mayoría de los casos (no considera la notación exponencial y el valor "NaN" ):fuente
Utilicé la función ya mencionada, pero pronto noté que las cadenas como "Nan", "Inf" y su variación se consideran números. Por lo tanto, le propongo una versión mejorada de la función, que devolverá falso en ese tipo de entrada y no fallará las variantes "1e3":
fuente
if text.isalpha():
cheque de inmediato?Intenta convertir a flotador. Si hay un error, imprima la excepción ValueError.
Salida:
fuente
Al pasar el diccionario como argumento, convertirá cadenas que se pueden convertir en flotantes y dejará otras
fuente
Estaba buscando un código similar, pero parece que usar try / excepts es la mejor manera. Aquí está el código que estoy usando. Incluye una función de reintento si la entrada no es válida. Necesitaba verificar si la entrada era mayor que 0 y, de ser así, convertirla en flotante.
fuente
fuente
Probé algunas de las opciones simples anteriores, usando una prueba de prueba para convertir a flotante, y descubrí que hay un problema en la mayoría de las respuestas.
Prueba simple (en la línea de las respuestas anteriores):
El problema viene cuando:
Entonces estás intentando lo
float('-')
que fallaEntonces estás intentando lo
float('')
que también fallaLa solución rápida que tuve es:
fuente
Parece ser simple.
Maneja valores almacenados como una cadena o int o flotante
fuente