2012-09-16 116 views
3

我有一个字符串:Python列表字符串列表

s= "[7, 9, 41, [32, 67]]" 

,我需要的是字符串转换成一个列表:

l= [7, 9, 41, [32, 67]] 

的问题是,当我使用列表(S)我得到这样的:

['[', '7', ',', ' ', '9', ',', ' ', '4', '1', ',', ' ', '[', '3', '2', ',', ' ', '6', '7', ']', ']'] 

我使用Python 3.2

+0

该字符串的格式是什么? JSON?蟒蛇?其他? – 2012-09-16 14:27:07

+1

你得到你要做的原因是字符串是可迭代的,字符作为条目。如果你传递一个可迭代的'list',它会给你一个包含iterable条目的列表。 – katrielalex

回答

4

可以做的正是你用ast.literal_eval()要求什么:

>>> ast.literal_eval("[7, 9, 41, [32, 67]]") 
[7, 9, 41, [32, 67]] 

但是,您可能希望首先使用像JSON这样的标准序列化格式,而不是依赖Python对象的字符串表示形式。 (作为一个方面说明,你所拥有的字符串甚至可能是JSON,因为这个特定对象的JSON表示看起来与Python字符串表示相同。由于你没有提到JSON,我假设这不是你曾经使用过的得到这个字符串)

+0

+1正确序列化数据。 – katrielalex

+0

我想这样做,因为我通过套接字将数据作为字符串发送,有没有更好的方法? –

+1

@ParkerHoyes:是的,只要任何适当的序列化更好。查看Python的'json'和'pickle'模块,名称为两个。 –

2

使用ast模块,它有一个方便的.literal_eval() function

import ast 

l = ast.literal_eval(s) 

蟒提示:

>>> import ast 
>>> s= "[7, 9, 41, [32, 67]]" 
>>> ast.literal_eval(s) 
[7, 9, 41, [32, 67]] 
2

你想用ast.literal_eval

import ast 
s= "[7, 9, 41, [32, 67]]" 
print ast.literal_eval(s) 
# [7, 9, 41, [32, 67]] 
0

这是另一种答案,但我不建议你。因为exec是危险的。

>>> s= "[7, 9, 41, [32, 67]]" 
>>> try: 
... exec 'l = ' + s 
... l 
... except Exception as e: 
... e 
[7, 9, 41, [32, 67]] 
0

为什么不使用eval()

>>> s = "[7, 9, 41, [32, 67]]" 
>>> eval(s) 
[7, 9, 41, [32, 67]]