Pergunta

Eu tenho cordas que olhar como esta:

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

e eu gostaria de converter cada um deles em uma estrutura de dados python. De preferência, uma lista (ou tupla) de tuplos contendo um par de valores de vírgula flutuante.

Eu poderia fazer isso com eval("(8, 12.25), (13, 15), (16.75, 18.5)") que me dá uma tupla de tuplas, mas eu não acho que ingenuamente avaliar informação externa seria uma decisão sábia.

Então, eu quis saber o que uma solução pythônico elegante pode parecer.

Foi útil?

Solução

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

Outras dicas

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

este deve fazer o trabalho.

Eu usei safe_eval para trabalhos como este no passado.

Se você estiver trabalhando com um arquivo CSV, e você quer mais do que a solução "ingênuo", que não lidar com quaisquer erros, você está provavelmente melhor fora de usar o CSV do Python módulo .

pyparsing .

Eu trabalhei com ele antes. Você pode obter algum comportamento de análise bastante robusto fora dele, e eu acho que fornece builtins que irá lidar com suas necessidades de análise inteiras com esse tipo de coisa. Olhe para cima commaSeparatedList e nestedExpr.

O que está errado em fazer isso sistematicamente? dividida em ")", em seguida, percorrer a lista, remova todos "(".

>>> 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']
['']

Agora você pode trazer cada elemento em sua estrutura de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top