在 python 中使用 ast_literal_eval

Sat*_*tya 2 python list

我有一个列表,项目是字符串,但从一些操作中我得到了列表,因为字符串项目被额外的“括起来”'string' "。如何摆脱它。

我的代码示例是

 import ast
 d = ["'WORKSHOP'", "'KIDS'", "'EXHIBITION'", "'FANTASY'", "'FESTIVAL'"]
 result = ast.literal_eval(d)
ValueError: malformed node or string: ["'WORKSHOP'", "'KIDS'", "'EXHIBITION'", "'FANTASY'", "'FESTIVAL'"]
Run Code Online (Sandbox Code Playgroud)

我想要的输出为:

result = ['WORKSHOP', 'KIDS', 'EXHIBITION', 'FANTASY', 'FESTIVAL']
Run Code Online (Sandbox Code Playgroud)

对于整数:

res = [123, 345, 566, 78]
Run Code Online (Sandbox Code Playgroud)

Kev*_*uan 6

ast.literal_eval()啊...你知道,你正在尝试在列表上使用。所以试试这个:

>>> import ast
>>> d = ["'WORKSHOP'", "'KIDS'", "'EXHIBITION'", "'FANTASY'", "'FESTIVAL'"]
>>> result = [ast.literal_eval(i) for i in d]
>>> result
['WORKSHOP', 'KIDS', 'EXHIBITION', 'FANTASY', 'FESTIVAL']
>>> 
Run Code Online (Sandbox Code Playgroud)

或者使用map()

>>> import ast
>>> d = ["'WORKSHOP'", "'KIDS'", "'EXHIBITION'", "'FANTASY'", "'FESTIVAL'"]
>>> result = map(ast.literal_eval, d)
>>> result
['WORKSHOP', 'KIDS', 'EXHIBITION', 'FANTASY', 'FESTIVAL']
>>> 
Run Code Online (Sandbox Code Playgroud)

请记住,在 Python 3 上它将返回一个map对象,要将其隐藏为列表,只需使用list(map(ast.literal_eval, d)).


解决此问题的另一种方法是简单地删除字符串中的第一个字符和最后一个字符,因为它们已经是字符串对象:

>>> d = ["'WORKSHOP'", "'KIDS'", "'EXHIBITION'", "'FANTASY'", "'FESTIVAL'"]
>>> [i[1:-1] for i in d]
['WORKSHOP', 'KIDS', 'EXHIBITION', 'FANTASY', 'FESTIVAL']
>>> list(map(lambda x: x[1:-1], d))
['WORKSHOP', 'KIDS', 'EXHIBITION', 'FANTASY', 'FESTIVAL']
>>> 
Run Code Online (Sandbox Code Playgroud)