嵌套字典检查键值

时间:2017-06-20 00:23:42

标签: python python-2.7 dictionary filter

我有一个嵌套字典,如下所示:(超过2个键"很多lala' s")

d={'lala': {'temp1': 'c', 'comp_b': 'bc', 'temp': 'b', 'comp_a': 'ac'}, 'lala1': {'temp1': 'c1', 'comp_b': 'bc1', 'temp': 'b1', 'comp_a': ''}

对于" a"中的所有父键,我需要检查键(comp_a和comp_b)是否具有有效值。 在这种情况下," comp_a" " lala1"没有价值。所以我需要我的功能只返回" lala"作为输出。

要检查的父键=> a= ['lala','lala1']

keys =>的必需值compulsory= ['comp_b','comp_a']

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

def check_args(a,d):
    compulsory=['comp_b','comp_a']
    valid=[]
    for a in d:
        for elements in compulsory:
            try:
                if d.get(a,{}).get(elements) !='':
                    print "Valid"
            except:
                break
        else:
            print "Can't parse details of " + a + " as mandatory data missing "
            continue

问题:  如何返回有效的父密钥,即" lala"?  有没有更好的方法来做我到目前为止所做的事情?

2 个答案:

答案 0 :(得分:1)

这是一种没有try except

的干净方式
d={'lala': {'temp1': 'c', 'comp_b': 'bc', 'temp': 'b', 'comp_a': 'ac'}, 'lala1': {'temp1': 'c1', 'comp_b': 'bc1', 'temp': 'b1', 'comp_a': ''}}

compulsory= ['comp_b','comp_a']

ok_keys = [k for k,v in d.iteritems() if all([c in v and v[c]!='' for c in compulsory])]
ok_keys #<-- prints ['lala']

逻辑全部发生在列表推导中,它首先遍历d中的键,并测试所有强制键都在d[k]内且d[k][c]值是不是空的。

答案 1 :(得分:1)

如果我正确理解了这个问题,你想要检查字典值是否为所有 compulsory元素一个值?

当然,更优雅的方法是:您可以使用列表理解

e = {}
[key for key in a if all(d.get(key,e).get(c) for c in compulsory)]

all(d.get(key,e).get(c) for c in compulsory)在这里至关重要,因为它是过滤条件。因此,all(..)将开始枚举compulsory列表,并且对于每个元素c,它将获取该元素并查看其真实性是否为{{1} }。空字符串的真实性为True,因此无法正常工作。如果密钥不在字典中,则False将返回.get(c),其真实性为None