递归调用eval中的变量值



实际上我有两个dict"d"one_answers"d1",其中dict"d"包含一些组,dict"d1"包含公式。

d = {
 'a;0': {'2010': 'A;B', 'p': '', 'r': ''},
 'a;1': {'2010': '1;',  'p': '', 'r': ''},
 'a;2': {'2010': '7;8', 'p': '', 'r': ''},
 'b;0': {'2010': 'C;D', 'p': '', 'r': ''},
 'b;1': {'2010': '5;6', 'p': '', 'r': ''}
}

这里,a;0包含字段2010(即A,B)中的标签,而b;0是另一个具有标签(C,D)的组,a;1a;2是包含字段2010中的值的a;0的子群('1','')和('7','8'),类似地,b;1是包含值('5','6')的b;0中的子群。

d1 = {
  'F':{'p':'','r':'','2010':'A+B'},
  'G':{'p':'','r':'','2010':'F+A'}
}

这是公式dict,其中F='A+BG=F+A,当我尝试用下面的代码运行它时,它只打印F值,而不打印G值。我使用的代码是

tag=[]
d2={}
for k,v in d.items():
    if ';' in k: # i am checking in main dict is their any subgroups
        a=k.split(';')
if a[1]=='0': # i am splitting it and checking if list zero bcoz main groups contain 0 ie('a;0','b;0') 
        pass
else:
        tag=d[a[0]+';0']['2010'].split(";")#splitting main group into tags
        value=v['2010'].split(";") #contain values 
        c=[0 if value[i]=='' else value[i] for i in range(len(value))]# if any balnk value in list values make it zero.bcoz i should use it eval
        for i in range(len(c)): #converting to int 
            try:
                c[i]=int(c[i])
            except ValueError:
                c[i]=str(c[i])
        x=dict(zip(tag,c)) # making a dict of tag n values for each iteration
        print '<%s>'%a[0] #printing group name
        for i in range(len(value)):
            if value[i]=='':
                tag[i]=''
            else:
                print '<%s>%s<%s>'%(tag[i],value[i],tag[i])
        for k,v in d1.items():
            try:
                d2[k]={'p':'','r':'','2010':eval(d1[k]['2010'],x)} #trying to use eval
            except NameError:
                continue
        print '</%s>'%a[0] 

由此,它在组中打印,但不计算"G"的值

此输出为

<a>
<A>7</A>
<B>8</A>
<F>15</F>
</a>
<a>
<A>1</A>
<F>1</F>
</a>
<b>
<C>5</C>
<D>6</D>
</b>

但我想要的输出是

<a>
<A>7</A>
<B>8</A>
<F>15</F>
<G>22</G>
</a>
<a>
<A>1</A>
<F>1</F>
</a>
<b>
<C>5</C>
<D>6</D>
</b>

我想在组中打印"G"值

请任何人帮助我,提前感谢

您的代码真的不容易阅读。看了半个小时,我还是不明白它在干什么。几个一般的指针:

  • 阅读并应用PEP8
  • 使用更具描述性的名称。你得到的最好的名字是"value",它实际上看起来是一个值的元组。还要避免在不同的地方重复使用相同的名称,尤其是循环。您有这样的嵌套循环,这只是在找麻烦
  • 考虑将代码重构为执行特定任务的函数。并适当地命名它们
  • 添加好的评论来解释你在做什么

如果你做了所有这些,你可能会很容易地发现自己的错误,但如果没有,那么就用可读性更强的代码发回。

最新更新