为了账号安全,请及时绑定邮箱和手机立即绑定

按照老师的程序敲出来,运行结果不一样

import itertools

import re

operator = ['+','-','*','/']


format = ['((%d%s%d)%s%d)%s%d',

          '(%d%s%d)%s(%d%s%d)',

          '(%d%s(%d%s%d))%s%d',

          '%d%s((%d%s%d)%s%d)',

          '%d%s(%d%s(%d%s%d))']


def combine (numlist,oplist=operator):

    expre=[]  

    for ii in list(itertools.permutations(numlist,len(numlist))):

        for jj in list(itertools.product(oplist,repeat=3)):

            expre.append(Turn(list(ii),list(jj)))

    return expre   


def Turn(num,letter):

    result=[]

    for i in range(len(num)):

        result.append(num[i])  

        try:                  

            result.append(letter[i]) 

        except IndexError:

            pass   

    return result


def GetExpression(numlist,target,form=format):

    expre=set()

    exall=combine(numlist)

    for ex in exall:

        for fm in form:

            try:

                exp=str(fm)%tuple(ex)

                if eval(exp)==target:

                    expre.add(exp)

            except ZeroDivisionError:

                pass

    return expre


def NumOperator(str):

    save=[]

    start=''

    for sr in str:

        try:

            int(sr)

            start+=sr

        except ValueError:

            if start=='':

                save.append(sr)

            else:

                save.append(start)

                save.append(sr)

            start=''

    if start!='':

        save.append(start)

    return save    


def Simple(exprelist):

    simple=[]    

    Last=[]  

    for ex in exprelist:

        sr=ex

        p=re.findall("\([^()+]\)",ex)

        for ii in p:

            ex=ex.replace(ii,str(eval(ii)))

        simp=NumOperator(ex)

        if sorted(simp) not in simple:

            simple.append(sorted(simp))

            Last.append(sr)

    return Last

    

for j in list(Simple(GetExpression([11,3,5,1],24))):

    print ('%s = %s'% (j,eval(j)))

>>> (11-5)*(1+3) = 24

为什么和老师一样的代码,但运行结果却只有一个啊?求老师解答!!!

正在回答

2 回答

def NumOperator(str):

    save=[]

    start=''

    for sr in str:

        try:

            int(sr)

            start+=sr

        except ValueError:

            if start=='':

                save.append(sr)

            else:

                save.append(start)

                save.append(sr)

            start=''

    if start!='':

        save.append(start)

    return save   

请问这个NumOperator方法将表达式4*6转化为字符集的['4','6','*']的原理是什么啊?初学者求大神解答!

0 回复 有任何疑惑可以回复我~
#1

风落几番

实际上是对每一个字符将它强转成int,遇到可以转的,就变成数字,不能转的ValueError的就是符号,把符号前当作数字存好,把符号单独放好。仔细想一下嘿嘿
2020-03-05 回复 有任何疑惑可以回复我~

 p=re.findall("\([^()+]\)",ex)应改为 p=re.findall("\([^()]+\)",ex),太粗心了?

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

按照老师的程序敲出来,运行结果不一样

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信