2013-08-06 43 views
5

我有这样"['first', 'sec', 'third']"Python字符串列出最佳实践

什么是将此转换为字符串即列表的最佳方式的字符串。 ['first', 'sec', 'third']

+1

最好的方法是使用已知的序列化格式,如json。 –

回答

10

我会使用literal_eval(),它是安全的:

安全评估的表达式节点或含有一个Python 表达式的字符串。提供的字符串或节点可能只包含以下Python文字结构中的 :字符串,数字,元组,列表, 字典,布尔值和无。

这可用于安全评估包含来自不受信任源的Python 表达式的字符串,而不需要自己解析 值。

>>> import ast 
>>> ast.literal_eval("['first', 'sec', 'third']") 
['first', 'sec', 'third'] 

它没有EVAL任何东西,除了文字表述:

>>> ast.literal_eval('"hello".upper()') 
... 
ValueError: malformed string 

>>> ast.literal_eval('"hello"+" world"') 
... 
ValueError: malformed string 
+0

谢谢alecxe,我一直在使用这个,但我很好奇,想看看人们在想什么,其他方法等。 – Ruth

+2

+1 - 这是最好的方法,因为'ast.literal_eval()'是安全的,相反到'eval()'。也就是说,如果可能的话,最好的选择可能是以更标准化的格式存储数据。 –

1

如果 他们总是格式化为你说 所有的字符串以同样的方式引用,一个简单的拆分也应该这样做:

"['first', 'sec', 'third']".split("'")[1::2] 

该解决方案更脆弱,因为它只支持一个现成的婷的风格。

虽然它速度相当快。

%timeit "['first', 'sec', 'third']".split("'")[1::2] 
1000000 loops, best of 3: 726 ns per loop 

%timeit ast.literal_eval("['first', 'sec', 'third']") 
10000 loops, best of 3: 21.8 us per loop 
+0

很酷,但是如果列表是'''''''','sec','third','fourth',''或甚至'L =“”“'''''','sec','第三','第四']“”“' – TerryA

+0

不错的例子。我会让答案生效,我希望它能帮助说明为什么literal_eval是更好的做法。 –