我有一个嵌套字典,如下所示:(超过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"? 有没有更好的方法来做我到目前为止所做的事情?
答案 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
。