2012-02-27 23 views
1

のは、私はこのように、この文字列があるとしましょう:リストに文字列を変換し

string = ("['1.345', '1.346', '1.347']") 

だから、それがリストのようにフォーマットされたが、私は、実際のリストオブジェクトに変換する必要があります。どうやってやるの?

+1

リストはどこから来たのですか? –

答えて

13

astモジュールのliteral_evalを使用できます。

>>> string = ("['1.345', '1.346', '1.347']") 
>>> import ast 
>>> lst = ast.literal_eval(string) 
>>> lst 
['1.345', '1.346', '1.347'] 

ところで、文字列のまわりにかっこは必要ありません。 string = "['1.345', '1.346', '1.347']"はうまく動作します。

私はストリップでしょう
+2

明確にするために、実際のコードではなく、リテラルのみを評価するため、これは 'eval'よりもはるかに優れています。したがって、任意のユーザー入力を行うことにはセキュリティ上の問題はありません。 – katrielalex

2
string = ("['1.345', '1.346', '1.347']") 
lst = eval(string) 
+1

ああ、これはユーザー入力だと想像してください...ほかに何がすべきですか? –

+0

はい - Praveenの 'literal_eval'はより良い –

0

「[」、「]」。などと、その文字列に分割()メソッドを使用します。..

lst = string.replace('[','').replace(']','').replace("'",'').replace(" ",'').split(',') 

私は、文字列がうまくフォーマットされている場合、それはevalのよりも安全だと思います、 Pythonはすべてのreplaceメソッドで新しい文字列を作成する必要があるため、非常に効率的ではありません。

1

私たちがこれらの文字列の出所を知っていれば助けになるかもしれません。一般的に、Praveenの答えはあなたが与える例に関する良いものです。私は、代わりにあなたの文字列のsinglequotesの二重引用符を使用すると、全部の有効なJSONになるだろうということ、しかし、言及したいと思います。また、行うことができ、その場合には:

パフォーマンスを測定
import json 
json.loads('["1.345", "1.346", "1.347"]') # [u'1.345', u'1.346', u'1.347'] 

import timeit 

s = """\ 
import ast 
ast.literal_eval("['1.345', '1.346', '1.347']") 
""" 

t = timeit.Timer(stmt=s) 
print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000) 

結果:21.25マイクロ秒/パス

import timeit 

s = """\ 
import json 
json.loads('["1.345", "1.346", "1.347"]') 
""" 

t = timeit.Timer(stmt=s) 
print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000) 

結果:6.32 usec/pass

これはあなたのための代替手段かもしれません。

+0

OPが文字列の引用符を変換しなければならないという事実を別にすれば、なぜjsonモジュールはastモジュールより柔軟性が低いと思いますか? – jena

+0

ええ、実際に私はあなたに同意する必要があります、JSONは、Pythonのリテラルができるすべてのデータを表すことができます。私のコメントを削除:) –