2012-02-27 44 views
1

比方说,我有这样的字符串是这样的:将字符串转换为一个列表

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

所以它的格式类似于列表,但我需要将其转换为实际列表对象。我怎样才能做到这一点?

+1

列表从哪里来的? – 2012-02-27 00:06:08

回答

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 2012-02-27 01:02:20

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

呃,想象这是用户输入...还有什么呢? – 2012-02-27 00:06:55

+0

是的 - Praveen的'literal_eval'更好 – 2012-02-27 00:08:41

0

我会剥夺“[”,“]”等,并使用分裂该字符串()方法..

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

我认为它比的eval更安全,如果字符串格式,但是效率不高,因为Python必须用每个替换方法构建一个新的字符串。

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 2012-02-27 01:28:31

+0

是的,实际上我必须同意你的观点,JSON可以表示Python文字可以包含的任何数据。删除了我的评论:) – 2012-02-27 02:30:20