在eval中递归调用变量值

时间:2012-03-16 07:07:23

标签: python dictionary

实际上我有两个词典“d”和“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;1,{ {1}}是a;2的子组,包含字段a;0('1','')和('7','8')中的值,类似2010是子-{1}}中的-group包含值('5','6')。

b;1

这是公式dict,其中b;0d1 = { 'F':{'p':'','r':'','2010':'A+B'}, 'G':{'p':'','r':'','2010':'F+A'} } ,当我尝试使用下面的代码运行它时,它只打印F='A+B值而不是G=F+A值。我使用的代码是

F

由此在组中打印,但未计算“G”的值

这是

的输出
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'值

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

1 个答案:

答案 0 :(得分:2)

您的代码真的不容易阅读。看了半个小时后,我仍然无法弄清楚它在做什么。一些一般指示:

  • 阅读并应用PEP8
  • 使用更具描述性的名称。你得到的最好的名字是“价值”,实际上似乎是一个价值元组。还要避免在不同的地方重复使用相同的名称,尤其是循环。你有这样的嵌套循环,这只是一个问题。
  • 考虑将代码重构为执行特定操作的函数。并恰当地命名。
  • 添加good comments解释您正在做的事情。

如果你做了这一切,你可能会很容易地找到你自己的错误,但如果没有,那么用更易读的代码回复。