2017-06-08 5 views
0

ファイルから行を抜き出しています。行は次のようになります。文字列のリスト(タプルであると思われる)から引用符を削除する

['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)'] 

これらの文字列をタプルに変換する方法はありますか?私はx.strip() for x in rowを試したが、それは役に立たなかった。

ありがとうございます。

+0

どのようにファイルからそれらを引っ張っている、あなたは私たちにコードを示すことができます – depperm

答えて

2

これは機能しますか?

import ast 

string = "['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']" 
string = string.replace("'", "") 
string = ast.literal_eval(string) 

出力は次のようになります。

In : string 
Out: 
[(27.0, 168.0), 
(32.0, 550.0), 
(88.0, 835.0), 
(46.0, 660.0), 
(38.0, 430.0), 
(34.0, 285.0), 
(72.0, 701.0), 
(29.0, 434.0), 
(0, 2)] 

In : type(string) 
Out: list 

In : [type(x) for x in string] 
Out: [tuple, tuple, tuple, tuple, tuple, tuple, tuple, tuple, tuple] 

astモジュールは、私は私が正しく理解していれば、あなたが探しているものだと思うの文字列を評価します。

+0

うん、それはトリックをした。ありがとう! –

+0

問題ありません。あなたの質問が解決したら、受け入れられた答えに印を付けてください。 – Deuce

1

これはトリックを行う必要があります。

from ast import literal_eval as make_tuple 
a = ['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)'] 
b = [make_tuple(x.strip()) for x in a] 
0

evalを使用すると簡単に実行できます。

# bad practice 
a = ['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)'] 
b = [eval(tuple_str.strip()) for tuple_str in a] 

UPDATE

あなたが以下のコメントに見ることができるように、literal_evalを使用する方が安全です。

+0

ここでは 'eval'は必要ではないので、この場合はおそらく避けるべきです。 –

+0

@WillDaSilvaなぜあなたはそれを避けるべきだと思いますか? –

+0

質問では、入力がファイルから来ていると述べています。ファイルのソースを信頼できるかどうかわからないので、 'eval'を呼びたくない悪意のあるコードが含まれているかのように扱うべきです。 'ast'モジュールから' literal_eval'を使うことで、コードの挿入などの問題を心配する必要はありません。安全で簡単です。 –

関連する問題