如何解析python中的列表以组合整数,同时只留下方程的运算符?
list =['(' ,'1', '+', '2', ')', '+', '(', '2', '0'. '0', '/', '2', '5', ')']
我希望最终能够使用这样的列表来创建从用户输入中获取的可计算等式。有可能吗?
答案 0 :(得分:2)
如果要进行计算,请完全跳过转换为整数并执行eval
。假设您从输入'(1+2)+(200/25)'
获得此字符串,您可以执行以下操作:
calc_result = eval(calc_input) # equals 11
但是要小心,使用eval可以运行任何给它的python代码,所以如果它是一个供公众使用的程序,有人会找出一种方法来使用这个部分来插入你从未打算过的代码。允许。
通常应避免使用<{eval
和exec
,因为它们可能存在安全风险。有关详细信息,请参阅SO退伍军人Ned Batchelder的Eval really is dangerous(感谢@ PM2Ring的评论)
答案 1 :(得分:1)
如果您不介意使用https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#jgroups-backend:
from sympy import sympify
lst = ['(', '1', '+', '2', ')', '+', '(', '2', '0', '0', '/', '2', '5', ')']
res = sympify(''.join(lst))
print(res) # 11
(不确定你的意思是单独留下一个等式的运算符。你的表达式不是一个等式......)。
答案 2 :(得分:1)
要正确地执行此类操作,您需要一个解析器。您可以创建自己的:解析算法已有详细记录。但是,您不需要从头开始构建解析器,您可以使用像pyparsing这样的包来创建解析器。
如果您保证您的用户输入完全安全,那么您可以让Python通过内置的eval
函数为您评估它。但是,eval
很慢,而且它是一个安全漏洞,因为它可以用来执行任意代码,正如Ned Batchelder在Ofer Sadan的回答中链接的文章所述。
但是要回答您的直接问题,我们可以轻松地从字符串列表中获取数字,将它们连接在一起,并将生成的数字字符串转换为整数。使用itertools.groupby
可以轻松地对数字进行分组并将其与非数字分开。你只需要给它一个可以用来识别组的功能;我们可以使用str.isdigit
。这是一个简短的演示:
from itertools import groupby
lst = ['(' ,'1', '+', '2', ')', '+', '(', '2', '0', '0', '/', '2', '5', ')']
a = [int(''.join(g)) if k else next(g) for k, g in groupby(lst, str.isdigit)]
print(a)
<强>输出强>
['(', 1, '+', 2, ')', 200, '/', 25, ')']
如果你还想处理+
和-
符号和小数点,那么写一个能够做到这一点的函数并不难。正确处理所有浮点数有点棘手,使用已经知道如何做到这一点的解析器可能更好。 ;)