J'ai du code Python qui parcourt une liste de chaînes et les convertit en nombres entiers ou en nombres à virgule flottante si possible. Faire cela pour les entiers est assez facile
if element.isdigit():
newelement = int(element)
Les nombres à virgule flottante sont plus difficiles. À l'heure actuelle, j'utilise partition('.')
pour diviser la chaîne et vérifier que l'un ou les deux côtés sont des chiffres.
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)
Cela fonctionne, mais évidemment la déclaration if pour cela est un peu un ours. L'autre solution que j'ai envisagée est de simplement envelopper la conversion dans un bloc try / catch et de voir si elle réussit, comme décrit dans cette question .
Quelqu'un a-t-il d'autres idées? Opinions sur les mérites relatifs de la partition et des approches try / catch?
la source
Méthode Python pour vérifier le flottant:
Ne vous laissez pas mordre par les gobelins qui se cachent dans le bateau flottant! FAITES UN TEST D'UNITÉ!
Ce qui est et n'est pas un flotteur peut vous surprendre:
la source
isfloat(" 1.23 ")
etisfloat(" \n \t 1.23 \n\t\n")
. Utile dans les demandes Web; pas besoin de couper d'abord les espaces blancs.qui ne reviendra
true
que s'il y en a un ou pas de '.' dans la chaîne de chiffres.reviendra
false
reviendra
false
la source
[i for i in df[i].apply(lambda x: str(x).replace('.','').isdigit()).any()]
TL; DR :
try: except:
méthode est la meilleure méthode native Python.Il existe une autre méthode disponible via un module tiers appelé fastnumbers (divulgation, je suis l'auteur); il fournit une fonction appelée isfloat . J'ai pris l'exemple le plus simple décrit par Jacob Gabrielson dans cette réponse , mais j'ai ajouté la
fastnumbers.isfloat
méthode. Je dois également noter que l'exemple de Jacob ne rendait pas justice à l'option regex parce que la plupart du temps dans cet exemple était passé dans des recherches globales à cause de l'opérateur point ... J'ai modifié cette fonction pour donner une comparaison plus justetry: except:
.Sur ma machine, la sortie est:
Comme vous pouvez le voir, regex n'est en fait pas aussi mauvais qu'il le paraissait à l'origine, et si vous avez un réel besoin de vitesse, la
fastnumbers
méthode est plutôt bonne.la source
Si vous vous souciez des performances (et je ne vous suggère pas de le faire), l'approche basée sur les essais est clairement gagnante (par rapport à votre approche basée sur les partitions ou à l'approche regexp), tant que vous ne vous attendez pas à beaucoup de chaînes non valides, auquel cas il est potentiellement plus lent (probablement en raison du coût de la gestion des exceptions).
Encore une fois, je ne suggère pas que vous vous souciez de la performance, je vous donne simplement les données au cas où vous le feriez 10 milliards de fois par seconde, ou quelque chose du genre. De plus, le code basé sur la partition ne gère pas au moins une chaîne valide.
Voici le code (Python 2.6, expression régulière tirée de la réponse de John Gietzen ):
la source
Juste pour la variété, voici une autre méthode pour le faire.
Edit: Je suis sûr que cela ne tiendra pas à tous les cas de flottement, surtout quand il y a un exposant. Pour résoudre cela, cela ressemble à ceci. Cela renverra True seulement val est un float et False pour int mais est probablement moins performant que regex.
la source
Cette expression régulière vérifiera les nombres à virgule flottante scientifiques:
Cependant, je pense que votre meilleur pari est d'utiliser l'analyseur dans un essai.
la source
Si vous n'avez pas à vous soucier d'expressions scientifiques ou autres de nombres et que vous ne travaillez qu'avec des chaînes qui pourraient être des nombres avec ou sans point:
Fonction
Version Lambda
Exemple
De cette façon, vous ne convertissez pas accidentellement ce qui devrait être un int, en un flottant.
la source
Version simplifiée de la fonction
is_digit(str)
, qui suffit dans la plupart des cas (ne prend pas en compte la notation exponentielle et la valeur "NaN" ):la source
J'ai utilisé la fonction déjà mentionnée, mais je remarque rapidement que les chaînes comme "Nan", "Inf" et sa variation sont considérées comme des nombres. Je vous propose donc une version améliorée de la fonction, qui renverra false sur ce type d'entrée et n'échouera pas sur les variantes "1e3":
la source
if text.isalpha():
chèque tout de suite?Essayez de vous convertir en flottant. S'il y a une erreur, imprimez l'exception ValueError.
Production:
la source
En passant le dictionnaire comme argument, il convertira les chaînes qui peuvent être converties en flottant et en laissera d'autres
la source
Je cherchais un code similaire, mais il semble que l'utilisation de try / excepts soit le meilleur moyen. Voici le code que j'utilise. Il comprend une fonction de nouvelle tentative si l'entrée n'est pas valide. J'avais besoin de vérifier si l'entrée était supérieure à 0 et si oui, de la convertir en flottant.
la source
la source
J'ai essayé certaines des options simples ci-dessus, en utilisant un test d'essai autour de la conversion en flottant, et j'ai trouvé qu'il y avait un problème dans la plupart des réponses.
Test simple (dans le sens des réponses ci-dessus):
Le problème survient lorsque:
Vous essayez alors
float('-')
ce qui échoueVous essayez alors
float('')
ce qui échoue égalementLa solution rapide que j'avais est:
la source
semble être simple.
Gère les valeurs stockées sous forme de chaîne, d'int ou de flottant
la source