Python-所有组合,包括方括号

时间:2019-02-12 18:51:08

标签: python python-3.x algorithm itertools

  

对于u个未知变量(例如a,b,c,d)和符号+-*/,找到所有长度为n的等式

     
    

一个例子是({for u=2, n=5):

         

(a + b)/ a

  

我当前的代码可以创建所有可能方程式的列表,但不带括号

v = ["a", "b"]            #Variables
s = ["+", "-", "*", "-"]  #Symbols
n = 7                     #Amount of variables and symbols
a = []                    #Lists combined (find possible equations from)
for i in range(n):
    if i % 2 == 0:
        a.append(v)
    else:
        a.append(s)
equations = list(itertools.product(*a))
for each in equations:
    print("".join(each))

总而言之,我编写的代码并未包含所有方程式的可能性。

例如对于n=5 and 2 variables,我的代码找不到(a+b)*b

的可能性

使用n=7 and 4 variables,它找不到`(a + b)*(c + d)

我的主要问题:如何创建一些可以吸收每个可能方程式并找到所有可能括号而不重复的代码

重复的示例:(a+b)*ca*(b+c)

注意:这是重复的,因为由于正在测试所有可能的方程式,因此在某个时刻a+b将变为b+c,因此*c将变为*a

1 个答案:

答案 0 :(得分:3)

该表达式可以工作,但是它确实具有很多表达式,例如x-xx/x,但用很多不同的表达式代替x。但是,它避免了由于关联性或可交换性造成的琐碎重复。

所有可能的表达式列表也很快变得很长。例如,如果有4个变量,而所有带有5个项的表达式,则可以获得7845320。生成器的使用将使您不会耗尽内存,但不会因此而耗费非常长的时间。

def all_expressions(size, variables):
    def _all_expressions(_size):
        if _size == 1:
            for variable in variables:
                yield (variable, '')
        else:
            for subsize in range(1, _size//2 + 1):
                for expr1, type1 in _all_expressions(subsize):
                    for expr2, type2 in _all_expressions(_size - subsize):
                        if subsize < _size - subsize or expr1 <= expr2:
                            if type1 == '+':
                                if type2 != '+':
                                    yield ("({} + {})".format(expr2, expr1), '+')
                            else:
                                yield ("({} + {})".format(expr1, expr2), '+')
                            if type1 == '*':
                                if type2 != '*':
                                    yield ("({} * {})".format(expr2, expr1), '*')
                            else:
                                yield ("({} * {})".format(expr1, expr2), '*')
                        if type1 != '*':
                            yield ("({} / {})".format(expr1, expr2), '/')
                        if type1 != '+':
                            yield ("({} - {})".format(expr1, expr2), '-')
                        if subsize < _size - subsize:
                            if type2 != '*':
                                yield ("({} / {})".format(expr2, expr1), '/')
                            if type2 != '+':
                                yield ("({} - {})".format(expr2, expr1), '-')
    for expr, t in _all_expressions(size):
        yield expr

for expr in all_expressions(3, ['a', 'b', 'c']):
    print(expr)