比方说,我有这样的字符串是这样的:将字符串转换为一个列表
string = ("['1.345', '1.346', '1.347']")
所以它的格式类似于列表,但我需要将其转换为实际列表对象。我怎样才能做到这一点?
比方说,我有这样的字符串是这样的:将字符串转换为一个列表
string = ("['1.345', '1.346', '1.347']")
所以它的格式类似于列表,但我需要将其转换为实际列表对象。我怎样才能做到这一点?
您可以使用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']"
工作得很好。
为了澄清,这比(eval)更好,因为它只评估文字而不是实际的代码。因此,采取任意用户输入并不存在安全问题。 – katrielalex 2012-02-27 01:02:20
string = ("['1.345', '1.346', '1.347']")
lst = eval(string)
呃,想象这是用户输入...还有什么呢? – 2012-02-27 00:06:55
是的 - Praveen的'literal_eval'更好 – 2012-02-27 00:08:41
我会剥夺“[”,“]”等,并使用分裂该字符串()方法..
lst = string.replace('[','').replace(']','').replace("'",'').replace(" ",'').split(',')
我认为它比的eval更安全,如果字符串格式,但是效率不高,因为Python必须用每个替换方法构建一个新的字符串。
如果我们知道这些字符串来自哪里,这可能会有所帮助。总的来说,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
也许这是您的替代方法。
撇开OP将不得不转换他的字符串中的引号的事实,为什么你会认为json模块在这种情况下比ast模块更不灵活? – jena 2012-02-27 01:28:31
是的,实际上我必须同意你的观点,JSON可以表示Python文字可以包含的任何数据。删除了我的评论:) – 2012-02-27 02:30:20
列表从哪里来的? – 2012-02-27 00:06:08