我试图从随机生成的整数和运算符创建函数。我目前采取的方法如下:
步骤1:生成运算符和整数的随机列表作为列表。
步骤2:将一组规则应用于列表,这样我总是得到一个整数,运算符,整数,运算符......等列表。
步骤3:将操作应用于整数后,使用修改后的列表创建单个答案。
例如:
第1步结果:[1,2,+, - ,2,/,3,8,*]
第2步结果:[1,+,2, - ,2,/,3,*,8] - 请注意,我使用operator命令在列表中生成运算符。
步骤3结果:输出是从左到右读取功能而不是应用BODMAS,因此在这种情况下我希望输出为8/3(输出不具备是一个整数)。
所以我的问题是:有什么功能(以及在什么模块中)可以帮助我组合上面定义的列表。或者我应该以不同的方式组合列表以允许我使用特定的函数吗?
我正在考虑改变我首先生成列表的方式,以便我即时进行排序,但我认为我最终会处于相同的情况,我不知道如何在完成排序过程后组合整数和运算符。
我觉得这里有一个简单的解决方案,我不必要地把自己绑在一起!
非常感谢任何帮助,
的Dom
答案 0 :(得分:0)
为什么不为整数创建一个列表,为运算符创建一个列表,并逐步从每个列表中追加它们?
编辑:你可以先将你的整数转换为字符串,然后使用string =''创建一个字符串。之后你可以只用eval(字符串)
edit2:您还可以看一下Sympy模块,它允许您在python中使用符号数学
答案 1 :(得分:0)
我不知道它是否更容易,但优雅的方法是使用二叉树,其中树叶是操作数,其他节点是运算符。你可以通过做这样的事情直接生成它(没有列表)(快速和肮脏,可能是错误的,但你明白了):
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个操作数。
答案 2 :(得分:0)
所以,对于那些感兴趣的人。我通过使用eval()函数实现了我的目标。虽然不是最强大的,但在我写的特定循环中,输入是受到严密控制的,所以我现在对这种方法很满意。