【问题标题】:Shift brackets through a equitation in python通过python中的马术移动括号
【发布时间】:2020-10-18 07:50:41
【问题描述】:

我有一个如下表达式:所有变量都是数字(浮点数或整数)

a+b*c+d*a+b

我想在 python 3 中创建一个循环函数或迭代,它在表达式中移动(括号),所以结果是变化的,并且带有打印输出函数,所以我可以跟踪哪个表达式属于哪个结果。 它必须涵盖所有可能的组合。

(a+b*c+d*a+b)
a+(b*c+d*a+b)
a+b*(c+d*a+b)
a+b*c+(d*a+b)
a+b*c+d*(a+b)
(a+b*c+d*a)+b
(a+b*c+d)*a+b
(a+b*c)+d*a+b
(a+b)*c+d*a+b

如果我们让它变得更困难,那么如果我能引入一个参数,那就太好了,它允许创建多于一对括号,即 2,并涵盖所有可能的组合

(a+b)*(c+d*a+b)
....
(a+b*(c+d)*a+b)
...
(a+b)*c+d*(a+b)
...

等等,所有可能的组合

有人知道如何解决这个问题吗?

提前非常感谢

【问题讨论】:

  • 由于 SO 不是免费的编码服务,我们要求您通过发布代码来展示您的努力。

标签: python-3.x list loops arraylist iterator


【解决方案1】:

您说的是动态创建表达式,这可以通过将它们编译为字节码来完成。

您正在寻找内置的 eval() 函数,该函数(除其他外)将表达式作为字符串接受,将其编译为字节码,并将表达式作为 Python 代码执行。

例如:

>> eval('2+2')
4

所以,你需要做的就是:

  1. 编写一个函数,将括号的所有可能组合生成为字符串
  2. 将每个字符串传递给 eval 方法

这是我的实现:

def parentheses(a, b, c, d):

    for num in range(0, 9, 2): 
        for closing_index in range(4, 13, 2):
            string_expression = ""
            list = [str(a), '+', str(b), '*', str(c), "+", str(d), '*', str(a), "+", str(b)]
            list.insert(num, '(')
            if closing_index < (num + 4):
                continue
            list.insert(closing_index, ')')
            for element in list:
                string_expression += element
            print(f'{string_expression} result: {str(eval(string_expression))}')
            string_expression = ''


parentheses(49, 2, 21, 4)

结果:

(49+2)*21+4*49+2 result: 1269
(49+2*21)+4*49+2 result: 289
(49+2*21+4)*49+2 result: 4657
(49+2*21+4*49)+2 result: 289
(49+2*21+4*49+2) result: 289
49+(2*21)+4*49+2 result: 289
49+(2*21+4)*49+2 result: 2305
49+(2*21+4*49)+2 result: 289
49+(2*21+4*49+2) result: 289
49+2*(21+4)*49+2 result: 2501
49+2*(21+4*49)+2 result: 485
49+2*(21+4*49+2) result: 487
49+2*21+(4*49)+2 result: 289
49+2*21+(4*49+2) result: 289
49+2*21+4*(49+2) result: 295

Process finished with exit code 0

更多信息:https://realpython.com/python-eval-function/

【讨论】:

  • 添加更多一对括号会有点困难,但您的解决方案是进一步扩展的良好基础。
  • 很高兴为您提供帮助!您可以投票和/或标记为已解决吗?我是一名新成员,正在努力建立代表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多