Question

J'ai des chaînes qui ressemblent à celle-ci:

"(8, 12.25), (13, 15), (16.75, 18.5)"

et je voudrais convertir chacun d’eux en une structure de données python. De préférence, une liste (ou un tuple) de n-uplets contenant une paire de valeurs float.

Je pourrais le faire avec eval ("(8, 12,25), (13, 15), (16,75, 18,5)") qui me donne un tuple de tuples, mais je ne Je ne pense pas que l’évaluation naïve des informations externes serait une sage décision.

Je me suis donc demandé à quoi pourrait ressembler une solution pythonique élégante.

Était-ce utile?

La solution

>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))

Autres conseils

def parse(s):
    tuples = s.split('), ')
    out = []
    for x in tuples:
        a,b = x.strip('()').split(', ')
        out.append((float(a),float(b)))
    return out

cela devrait faire le travail.

J'ai déjà utilisé safe_eval pour de tels travaux.

Si vous travaillez avec un fichier CSV et que vous voulez plus que le fichier "naïf". solution qui ne gère aucune erreur, vous feriez probablement mieux d'utiliser le module CSV de Python .

Téléchargez PyParsing .

J'ai déjà travaillé avec ça. Vous pouvez obtenir un comportement d'analyse assez robuste, et je pense qu'il fournit des fonctions intégrées qui gèrent tous vos besoins d'analyse avec ce genre de choses. Recherchez commaSeparatedList et nestedExpr.

quel est le problème avec le faire systématiquement? diviser sur ")", puis parcourez la liste, supprimez tous les "(".

>>> s="(8, 12.25), (13, 15), (16.75, 18.5)"
>>> [ i.replace("(","") for i in s.split(")") ]
['8, 12.25', ', 13, 15', ', 16.75, 18.5', '']
>>> b = [ i.replace("(","") for i in s.split(")") ]
>>> for i in b:
...  print i.strip(", ").replace(" ","").split(",")
...
['8', '12.25']
['13', '15']
['16.75', '18.5']
['']

Vous pouvez maintenant importer chaque élément dans votre structure de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top