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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top