Listes imbriquées et conversion en flotteurs

J'essaye de lire quelques nombres d'un dossier de texte et les convertis en liste de flotteurs, mais rien que j'essaye ne semble fonctionner correctement.

Voici mon code en ce moment:

python_data = open('C:\Documents and Settings\redacted\Desktop\python_lengths.txt','r')
python_lengths = []
for line in python_data:
    python_lengths.append(line.split())
python_lengths.sort()

print python_lengths

Il retourne:

[['12.2'], ['26'], ['34.2'], ['5.0'], ['62'], ['62'], ['62.6']]

(tous les supports inclus)

Mais je ne peux pas le convertir en une liste de flottants avec des commandes régulières comme:

python_lengths = float(python_lengths)

ou:

float_lengths = [map(float, x) for x in python_lengths]

parce qu'il semble être imbriqué ou quelque chose?

0

3 Réponses

def floats_from_file(f):
    for line in f:
        for word in line.split():
            yield float(word)

with open('C:/Documents and Settings/redacted/Desktop/python_lengths.txt') as f:
    python_lengths = list(floats_from_file(f))

python_lengths.sort()

print python_lengths

Notez que vous pouvez utiliser des barres obliques, même sous Windows. Si vous souhaitez utiliser des barres obliques inverses, vous devez utiliser une chaîne "brute" pour éviter les problèmes. Quel genre de problèmes? Eh bien, certains caractères sont spéciaux avec barre oblique inverse; Par exemple, \ n représente une nouvelle ligne. Si vous mettez simplement un chemin en guillemets simples, et qu'un des noms de répertoires commence par n , vous obtiendrez un retour à la ligne. Les solutions consistent à doubler les barres obliques inverses, à utiliser des chaînes brutes ou simplement à utiliser des barres obliques.

0
ajouté

La réponse de @ eumiro est correcte, mais voici quelque chose d'autre qui peut aider:

numbers = []
with open('C:\Documents and Settings\redacted\Desktop\python_lengths.txt','r') as f:
   for line in f.readlines():
      numbers.extend(line.split())

numbers.sort()
print numbers
0
ajouté

Cela arrive parce que .split() renvoie toujours une liste d'éléments même s'il n'y avait qu'un seul élément présent. Si vous changez votre python_lengths.append (line.split ()) en python_lengths.extend (line.split ()) , vous obtiendrez votre liste à plat que vous attendiez.

0
ajouté
/Fil. Merci beaucoup, vous n'avez aucune idée !! Ce mot m'a empêché de terminer ce programme pendant les 4 dernières heures.
ajouté l'auteur user1367212, source