【问题标题】:creating a simple function using lists of operators and integers使用运算符和整数列表创建一个简单的函数
【发布时间】:2016-05-24 13:04:39
【问题描述】:

编辑:当我在标题中说函数时,我的意思是数学函数而不是编程函数。很抱歉造成任何混乱。

我正在尝试从随机生成的整数和运算符创建一个函数。我目前采取的方法如下:

第 1 步:将运算符和整数的随机列表生成为列表。

第 2 步:将一组规则应用于列表,因此我总是以整数、运算符、整数、运算符...等列表结束。

第 3 步:将运算应用于整数后,使用修改后的列表创建单个答案。

例如:

第 1 步结果:[1,2,+,-,2,/,3,8,*]

第 2 步结果:[1,+,2,-,2,/,3,*,8] - 请注意,我使用 operator 命令生成列表中的运算符。

第 3 步结果:输出旨在成为从左到右的读取函数,而不是应用 BODMAS,因此在这种情况下,我希望输出为 8/3(输出不必是整数)。

所以我的问题是:什么功能(以及在什么模块中)可以帮助我组合上面定义的列表。或者我应该以不同的方式组合列表以允许我使用特定功能吗?

我正在考虑首先更改生成列表的方式,以便即时进行排序,但我认为我最终会遇到同样的情况,我不知道如何组合整数和经过排序过程后的运算符。

我觉得这里有一个简单的解决方案,我正在不必要地把自己绑起来!

非常感谢任何帮助,

Dom

【问题讨论】:

  • 你能试着澄清一下你想让这个函数做什么吗?你想要一个执行随机数学运算的函数吗?
  • 我希望函数将预定义列表解释为从左到右读取的数学函数。整数和运算符将由程序的另一部分预定义。
  • 因此,您将获得一份清单。 (1, +, 2, 3, /, 4) 是否等于 1+2 和 3/4?这就是你想要做的吗?
  • 不完全,列表将根据 Int, operator, int, operator... 等进行评估 如果它不自然地属于这种格式,根据您的示例,列表值将是下降,直到它出现,即我希望看到 1+2/4,其中 3 从列表中删除。
  • 所以,如果你有一个 list(1, 2, 3, /, 4) 你会希望它评估为 1/4??

标签: python list operators


【解决方案1】:

为什么不为整数创建一个列表,为运算符创建一个列表,然后逐步从每个列表中追加?

编辑:您可以先将整数转换为字符串,然后使用 string=''.joint(list) 创建一个字符串,然后您可以 eval(string)

edit2:您还可以查看允许您在 python 中使用符号数学的 Sympy 模块

【讨论】:

  • 我仍然需要了解如何从使用您的方法创建的列表中生成答案,不是吗?但是该列表是通过解释另一个随机创建的二进制数列表来创建的,因此实际上并不可行。
  • eval(string) 将失败,因为 OP 在这里不想要 eval('1+2-2/3*8') == -7/3 而不是 8/3 的优先操作。所以他需要括号来拥有eval('((((1+2)-2)/3)*8)'),是的,其中一些是无用的,但在任何地方添加它们可能更容易。
  • 感谢额外的 cmets,我现在正在调查这个问题。编辑:我刚刚看到 polku 的评论,这可以解释我遇到的问题。
【解决方案2】:

我不知道这是否更容易,但一种优雅的方法是使用二叉树,其中叶子是操作数,其他节点是运算符。你可以通过做这样的事情直接生成它(没有列表)(快速而肮脏,可能是错误的,但你明白了):

def generate(root, end_depth, depth):
    root = random_operator()
    right_child = random_operand()
    if depth == end_depth:
        left_child = random_operand()
    else:
        generate(left_child, end_depth, depth + 1)

你的例子是这样的:

         *
       /  \ 
     div   8
     / \
    -   3
   / \
  +   2
 / \
1   2

它是“向后”的,因为当您评估时,您需要从底部开始,其中 2 个操作数是已知的。

【讨论】:

    【解决方案3】:

    所以,对于那些感兴趣的人。我通过使用 eval() 函数实现了我的目标。虽然不是最强大的,但在我编写的特定循环中,输入受到严格控制,因此我目前对这种方法感到满意。

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 1970-01-01
      • 2011-01-28
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多