我愿意编写一个程序,对一组长度为 6 的正整数(例如:[1, 6, 3, 9, 2, 9]).
为此,我正在使用列表
symbols = ['+', '-', '*', '/']
并编写了一个嵌套循环来创建所有可能性
+ + + + +
+ + + + -
.
.
.
/ / / / *
/ / / / /
通过调用每一行(例如:+ - + * / )一个主题,以及 M 中所有主题的集合
M[0] = ['+', '+', '+', '+', '+']
M[1] = ['+', '+', '+', '+', '-']
等等。我现在的目标是写一个函数
evaluate_expression(motif, a, b, c, d, e, f)
吐出表达式的结果 a 主题[0] b 主题[1] c 主题[2] d 主题[3] e 主题[4] f
我的想法是尝试将 '+' 转换为符号 + 但我找不到办法做到这一点,我希望你们中的一些人知道如何做到这一点,我愿意接受任何建议修改以使其更干净。
答案 0 :(得分:4)
operator 库为您提供基本运算符的函数(例如 add()
、sub()
)
因此,您可以将 symbols = ['+', '-', '*', '/']
替换为:
from operator import add, sub, mul, truediv
symbols = [add, sub, mul, truediv]
现在你的motif生成函数应该是函数列表而不是字符串列表。
然后,假设您有一个 motif
列表,如您所称(查看 itertools.combinations_with_replacement()
以获取生成所有图案的函数),您可以通过执行以下操作来应用它:
motif = [add, add, sub]
values = [5, 6, 7, 8]
result = values[0]
for i, current_func in enumerate(motif):
result = current_func(result, value[i+1])
print(result)
注意:此方法不遵守操作顺序,它将按顺序应用函数,从左到右。
答案 1 :(得分:2)
使用函数指针字典似乎是您想要使用的。
from operator import add, sub, mul, truediv
operators = {
'+': add,
'-': sub,
'*': mul,
'/': truediv
}
def op(operator, a, b):
return operators[operator](a, b)
print(op('+', 1, 2))
print(op('-', 1, 2))
总的来说,它可能是这样的:
from operator import add, sub, mul, truediv
operators = {
'+': add,
'-': sub,
'*': mul,
'/': truediv
}
def op(operator_list, param_list):
assert len(operator_list)+1 == len(param_list)
assert len(param_list) > 0
res = param_list[0]
for i in range(len(operator_list)):
res = operators[operator_list[i]](res, param_list[i])
return res
print(op(['+', '-'], [1, 2, 4]))
答案 2 :(得分:-1)
您可以使用 eval("...")
执行字符串。
def evaluate_expression(operands, operators):
assert len(operands)==len(operators)+1
expression = str(operands[0])
for idx, operator in enumerate(operators):
expression += str(operator)+str(operands[idx+1])
return eval(expression)
可以像这样调用函数evaluate_expression([1,2,3,4,5],["+","-","+","-"])
,并计算 1+2-3+4-5 = -1
答案 3 :(得分:-1)
我认为没有直接的方法可以将字符串类型转换为运算符(至少在核心 python 库中),但您可以做的是将整个表达式创建为字符串并在传递时运行 eval()
opnd = [1, 6, 3, 9, 2]
oprt = ['+', '-', '*', '/']
def string_eval(operands,operators):
final_string = ""
for i in range(len(operands)):
final_string += str(operands[i])
if i < len(operators):
final_string += str(operators[i])
return eval(final_string)
print(string_eval(opnd,oprt))
输出-6.5