Analisi di una stringa che rappresenta un elenco di tuple
-
05-07-2019 - |
Domanda
Ho delle stringhe che assomigliano a questa:
"(8, 12.25), (13, 15), (16.75, 18.5)"
e vorrei convertirli ciascuno in una struttura di dati Python. Preferibilmente un elenco (o tupla) di tuple contenente una coppia di valori float.
Potrei farlo con eval (" (8, 12,25), (13, 15), (16,75, 18,5) ")
che mi dà una tupla di tuple, ma io non pensare che valutare ingenuamente le informazioni esterne sarebbe una decisione saggia.
Quindi mi chiedevo come potesse essere un'elegante soluzione pitonica.
Soluzione
>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))
Altri suggerimenti
def parse(s):
tuples = s.split('), ')
out = []
for x in tuples:
a,b = x.strip('()').split(', ')
out.append((float(a),float(b)))
return out
questo dovrebbe fare il lavoro.
Ho usato safe_eval per lavori come questo in passato.
Se stai lavorando con un file CSV e desideri più di " naive " soluzione che non gestisce alcun errore, probabilmente stai meglio usando il Modulo CSV di Python .
Scarica PyParsing .
Ci ho già lavorato prima. È possibile ottenere un comportamento di analisi abbastanza robusto da esso, e penso che fornisca builtin che gestiranno le tue intere esigenze di analisi con questo genere di cose. Cerca commaSeparatedList e nestedExpr.
cosa c'è di sbagliato nel farlo sistematicamente? dividere su ") " ;, quindi scorrere l'elenco, rimuovere tutto " (" ;.
>>> 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']
['']
Ora puoi portare ogni elemento nella tua struttura dati.