我正在尝试编写一个简单的数学表达式生成器。我遇到的问题是使用从一个范围内选择的随机数表达式,并在每个数字之间插入一个随机运算符。
这是我到目前为止所拥有的:
from random import randint
from random import choice
lower = int(raw_input("Enter a lower integer constraint: "))
higher = int(raw_input("Enter a higher integer constraint: "))
def gen_randoms(lower, higher):
integers = list()
for x in xrange(4):
rand_int = randint(lower, higher)
integers.append(rand_int)
return integers
def gen_equations(integers):
nums = map(str, integers)
print nums
operators = ['*', '+', '-']
equation = 'num op num op num op num'
equation = equation.replace('op', choice(operators))
equation = equation.replace('num', choice(nums))
print equation
nums = gen_randoms(lower, higher)
gen_equations(nums)
这里的问题是输出将重复运算符选择和随机整数选择,因此它提供5 + 5 + 5 + 5
或1 - 1 - 1 - 1
而不是1 + 2 - 6 * 2
之类的东西。如何指示choice
生成不同的选择?
答案 0 :(得分:5)
str.replace()
用第二个操作数替换第一个操作数的所有次出现。然而,不将第二个参数视为表达式。
一次替换一个事件; str.replace()
方法采用第三个参数来限制替换的次数:
while 'op' in equation:
equation = equation.replace('op', choice(operators), 1)
while 'num' in equation:
equation = equation.replace('num', choice(nums), 1)
现在,通过循环每次迭代都会调用choice()
。
演示:
>>> from random import choice
>>> operators = ['*', '+', '-']
>>> nums = map(str, range(1, 6))
>>> equation = 'num op num op num op num op num'
>>> while 'op' in equation:
... equation = equation.replace('op', choice(operators), 1)
...
>>> while 'num' in equation:
... equation = equation.replace('num', choice(nums), 1)
...
>>> equation
'5 - 1 * 2 * 4 - 1'
答案 1 :(得分:4)
我会使用替换dict
并使用它来替换每个“字”:
import random
replacements = {
'op': ['*', '+', '-'],
'num': map(str, range(1, 6))
}
equation = 'num op num op num op num op num'
res = ' '.join(random.choice(replacements[word]) for word in equation.split())
# 1 + 3 * 5 * 2 + 2
然后您可以对此进行概括,以便每个单词执行不同的操作,以便选择一个随机运算符,但按顺序保留数字......:
replacements = {
'op': lambda: random.choice(['*', '+', '-']),
'num': lambda n=iter(map(str, range(1, 6))): next(n)
}
equation = 'num op num op num op num op num'
res = ' '.join(replacements[word]() for word in equation.split())
# 1 + 2 + 3 - 4 * 5
注意,如果字符串中存在更多num
,则会抛出错误,然后替换中有...
答案 2 :(得分:0)
这一行只调用choice
一次:
equation = equation.replace('num', choice(nums))
它将'num'
的每个实例替换为您传递的一个值作为第二个参数。
这是预期的。
替换字符串中值的正确方法是使用format
或%
运算符。请参阅:http://docs.python.org/2/library/string.html
或者,您可以迭代地构建字符串。