如何将字符串形式的列表转换为列表
我在想,有什么简单的方法可以把下面这种字符串形式的列表转换成一个真正的 list
:
x = '[ "A","B","C" , " D"]'
即使用户在逗号之间加了空格,或者在引号里面加了空格,我也需要处理这些情况,并把它转换成:
x = ["A", "B", "C", "D"]
我知道可以用 strip()
和 split()
来去掉空格,还可以检查非字母字符。但是这样写的代码变得很复杂。有没有什么简单的函数我不知道呢?
21 个回答
117
eval
是个危险的东西 - 你不应该执行用户输入的内容。
如果你使用的是 2.6 或更新的版本,建议用 ast 代替 eval:
>>> import ast
>>> ast.literal_eval('["A","B" ,"C" ," D"]')
["A", "B", "C", " D"]
有了这个之后,记得用 strip
去掉字符串两边的空白。
如果你用的是旧版本的 Python,可以用一个简单的正则表达式来接近你想要的效果:
>>> x='[ "A", " B", "C","D "]'
>>> re.findall(r'"\s*([^"]*?)\s*"', x)
['A', 'B', 'C', 'D']
不过这个方法没有 ast 方案好,比如它不能正确处理字符串中的转义引号。但它简单,不涉及危险的 eval,如果你用的是没有 ast 的旧版 Python,这个方法可能也足够用了。
254
json
模块是处理字符串化字典列表的更好选择。当你有一个字符串形式的字典列表时,可以使用json.loads(your_data)
这个函数把它转换成一个列表。
>>> import json
>>> x = '[ "A","B","C" , " D"]'
>>> json.loads(x)
['A', 'B', 'C', ' D']
类似的
>>> x = '[ "A","B","C" , {"D":"E"}]'
>>> json.loads(x)
['A', 'B', 'C', {'D': 'E'}]
1198
>>> import ast
>>> x = '[ "A","B","C" , " D"]'
>>> x = ast.literal_eval(x)
>>> x
['A', 'B', 'C', ' D']
>>> x = [n.strip() for n in x]
>>> x
['A', 'B', 'C', 'D']
这个功能可以用来计算一个表达式节点或者一个只包含Python基本数据类型或容器的字符串。你给的字符串或节点只能包含以下这些Python基本结构:字符串、字节、数字、元组、列表、字典、集合、布尔值、
None
和Ellipsis
。它可以用来处理包含Python值的字符串,而不需要自己去解析这些值。需要注意的是,它不能处理复杂的表达式,比如涉及运算符或索引的情况。