Python:`choice()`选择相同的选择

时间:2013-08-19 18:36:15

标签: python

我正在尝试编写一个简单的数学表达式生成器。我遇到的问题是使用从一个范围内选择的随机数表达式,并在每个数字之间插入一个随机运算符。

这是我到目前为止所拥有的:

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 + 51 - 1 - 1 - 1而不是1 + 2 - 6 * 2之类的东西。如何指示choice生成不同的选择?

3 个答案:

答案 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

或者,您可以迭代地构建字符串。