17

私はこのような文字列を持っています:

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

それぞれをPythonデータ構造に変換したいと思います。できれば、float値のペアを含むタプルのリスト(またはタプル)。

タプルのタプルを取得することでそれを行うことはできますがeval("(8, 12.25), (13, 15), (16.75, 18.5)")、外部情報を素朴に評価することは賢明な決断ではないと思います。

だから私はエレガントなpythonicソリューションがどのように見えるのか疑問に思いました。

4

6 に答える 6

26
>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))
于 2009-11-27T18:29:06.187 に答える
4
def parse(s):
    tuples = s.split('), ')
    out = []
    for x in tuples:
        a,b = x.strip('()').split(', ')
        out.append((float(a),float(b)))
    return out

これでうまくいくはずです。

于 2009-11-27T18:53:35.377 に答える
2

過去にこのようなジョブにsafe_evalを使用しました。

于 2009-11-27T19:03:19.457 に答える
1

体系的にやって何が悪いの?")" で分割し、リストを調べて、すべての "(" を削除します。

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

これで、各要素をデータ構造に取り込むことができます。

于 2009-11-27T23:21:31.663 に答える
1

PyParsingをダウンロードします。

私は以前にそれを使ったことがあります。それからかなり堅牢な解析動作を得ることができ、この種の解析ニーズ全体を処理するビルトインを提供すると思います。commaSeparatedList と nestedExpr を検索します。

于 2009-11-27T18:35:39.017 に答える
1

CSV ファイルで作業していて、エラーを処理しない「単純な」ソリューション以上のものが必要な場合は、おそらくPython の CSV モジュールを使用するのが最適です。

于 2009-11-27T18:29:21.693 に答える