我正在使用python并面临问题从具有该列表的字符串中提取特定列表对象。
这是我在字符串中的列表对象。
input = "[[1,2,3],[c,4,r]]"
我需要这样的输出。
output = [[1,2,3],[c,4,r]]
有没有办法做到这一点?
答案 0 :(得分:1)
Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.8.2] on linux
import ast
input = "[[1,2,3],['c',4,'r']]"
output = ast.literal_eval(input)
output
=> [[1, 2, 3], ['c', 4, 'r']]
如果您实际上意味着c
和r
只是变量c
和r
的当前值,而不是文字'c'
和{ {1}},您需要使用相当不安全的'r'
,但其他方式也一样。
答案 1 :(得分:0)
如果ast.literal_eval
不够,c
和r
是应该解释的非平凡数据对象,您可以考虑使用asteval
({{ 3}})。它可以处理超出文字字符串的python字符串,包括它自己的符号表,并避免使用eval()
的许多已知漏洞。
asteval
就像一个带有简单平面命名空间的沙盒迷你解释器。您必须将c
和r
的值添加到asteval解释器,但示例可能是:
from asteval import Interpreter
aeval = Interpreter()
aeval('c = 299792458.0') # speed of light?
aeval('r = c/(2*pi)') # radius of a circle of circumference c?
# note that pi and many other numpy
# symbols and functions are built in
input_string = "[[1,2,3],[c,4,r]]"
out = aeval(input_string)
print(out)
将给出
[[1, 2, 3], [299792458.0, 4, 47713451.59236942]]
或者,您可以使用
直接从Python设置c
aeval.symtable['c'] = 299792458.0
asteval
拒绝做许多已知的不安全事情,但ast.literal_eval
也不能做许多事情。当然,如果你接受用户输入的代码,你应该非常小心。
答案 2 :(得分:-1)
使用ast模块literal_eval方法获得更安全的评估
import ast
input = "[[1,2,3],['c',4,'r']]"
output= ast.literal_eval(input)
print(output)
#[[1, 2, 3], ['c', 4, 'r']]
此代码在Python 3.6中进行了测试。它甚至可以在2.7中工作。
答案 3 :(得分:-1)
永远不要将输入用作变量名,它是python中的关键字:
你可以使用numpy:
import numpy as np
user_input = "[[1,2,3],[c,4,r]]"
print(np.array(user_input))
输出:
[[1,2,3],[c,4,r]]