2017-09-09 1 views
-1

J'ai un jeu de données simple de nombres de chaînes que je veux convertir en flottants. Pour une raison quelconque, les travaux suivants:Convertir la liste des chaînes en liste de flottants lorsque [float (i) for i in lst] ne fonctionne pas

dataset = open("data1.5.txt", "r") 
array = dataset.read().split(", \n") 
array2 = [float(array[0])] 
print(array2) 

Mais si je fais ce qui suit:

dataset = open("data1.5.txt", "r") 
array = dataset.read().split(", \n") 
array2 = [float(i) for i in array] 
print(array2) 

Je reçois l'erreur suivante:

ValueError        Traceback (most recent call last) 
<ipython-input-158-d3f4342981c6> in <module>() 
     1 dataset = open("data1.5.txt", "r") 
     2 array = dataset.read().split(", \n") 
----> 3 array2 = [float(i) for i in array] 
     4 print(array2) 

<ipython-input-158-d3f4342981c6> in <listcomp>(.0) 
     1 dataset = open("data1.5.txt", "r") 
     2 array = dataset.read().split(", \n") 
----> 3 array2 = [float(i) for i in array] 
     4 print(array2) 

ValueError: could not convert string to float: 

Si je tente:

dataset = open("data1.5.txt", "r") 
array = dataset.read().split(", \n") 
array2 = [float(array[i]) for i in array] 
print(array2) 
J'ai l'erreur suivante:
TypeError         Traceback (most recent call last) 
<ipython-input-160-60a5ed9c866f> in <module>() 
     1 dataset = open("data1.5.txt", "r") 
     2 array = dataset.read().split(", \n") 
----> 3 array2 = [float(array[i]) for i in array] 
     4 print(array2) 

<ipython-input-160-60a5ed9c866f> in <listcomp>(.0) 
     1 dataset = open("data1.5.txt", "r") 
     2 array = dataset.read().split(", \n") 
----> 3 array2 = [float(array[i]) for i in array] 
     4 print(array2) 

TypeError: list indices must be integers or slices, not str 

Et enfin, si je tente de passer par la carte(), je peux créer:

dataset = open("data1.5.txt", "r") 
array = dataset.read().split(", \n") 
array2 = map(float, array) 
print(array2) 

Mais qui retourne seulement un emplacement en Python 3; si je tente de le faire dans une liste comme ceci:

dataset = open("data1.5.txt", "r") 
array = dataset.read().split(", \n") 
array2 = list(map(float, array)) 
print(array2) 

Je reçois une erreur encore:

ValueError        Traceback (most recent call last) 
<ipython-input-164-68394d0c25fd> in <module>() 
     1 dataset = open("data1.5.txt", "r") 
     2 array = dataset.read().split(", \n") 
----> 3 array2 = list(map(float, array)) 
     4 print(array2) 

ValueError: could not convert string to float: 

J'ai aussi essayé d'ajouter les valeurs à une nouvelle liste dans une boucle, mais en vain. Je suis assez nouveau à Python et c'est franchement déroutant ... Comment float() semble fonctionner pour une itération de mes données mais pas pour l'ensemble entier?

S'il vous plaît noter que la méthode float() fonctionne pour tout point de la matrice et l'impression du tableau me donne un « propre » liste de chaînes, voici un extrait:

['0.60237078', '0.404667', '0.081656125', '0.99716862', '0.70149429', '0.59545983', '0.97768306', '0.86360343', '0.57052565', '0.47777524', '0.040106169', ...] 
+0

Quelle est la valeur de 'array', juste avant la compréhension de la liste? Le résultat de 'split' avait probablement une chaîne d'espaces comme l'un de ses membres. –

Répondre

0

Essayez d'ajouter un code de gestion des erreurs :

dataset = open("data1.5.txt", "r") 
array = dataset.read().split(", \n") 

def float_report_errors(val): 
    try: 
     return float(val) 
    except ValueError as e: 
     print("float(", repr(val), ") -->", repr(e)) 

array2 = [float_report_errors(i) for i in array] 
print("Indices with errors:", *(i for i,v in enumerate(array2) if v is None)) 

il y a des chances, il y a une ou plusieurs valeurs non-float cachés quelque part dans votre tableau de chaîne initiale qui salit les choses, mais parce que vous avez beaucoup de valeurs que vous manque un quelque part.

+0

Bonjour Amber, merci pour la réponse rapide. J'ai essayé votre code et je reçois le texte suivant: « » -> ValueError (« n'a pas pu convertir la chaîne à flotter: »,) Indices des erreurs: 1000 Vérification mon tableau, la dernière valeur (la 1000e) n'est en effet qu'un espace. Est-ce que cela pourrait déséquilibrer le tout? – Calembreloque

+0

Oui, c'est exactement ce qui se passe. Probablement parce que la fin du fichier ressemble ', \ n' et donc la scission crée une chaîne vide à la fin. Essayez d'appeler '.strip()' avant de scinder: 'dataset.read(). Strip(). Split (", \ n ")' – Amber

+0

Cela a fonctionné, merci beaucoup! J'ai ajouté un del basique après avoir créé la liste et maintenant tout va bien. Marquer celui-ci comme réponse correcte, et merci pour votre temps :) – Calembreloque