Python 检查字典是否没有所有键的值

Python 检查字典是否没有所有键的值,python,dictionary,Python,Dictionary,检查嵌套字典是否没有所有键的值的最佳方法是什么 例如: bool() 递归是可行的,但我很好奇,在性能和代码长度方面,是否有“更好”的方法来做到这一点——可能是在任何包函数中 def get_val(d): val = [] for k,v in d.items(): if (v): if (type(v) is dict): if (not get_val(v)):

检查嵌套字典是否没有所有键的值的最佳方法是什么

例如:

bool()

递归是可行的,但我很好奇,在性能和代码长度方面,是否有“更好”的方法来做到这一点——可能是在任何包函数中

def get_val(d):
    val = []
    for k,v in d.items():
        if (v):
            if (type(v) is dict):
                if (not get_val(v)):
                    return False
            else:
                return False
    return True

正如澄清的那样,此方法适用于嵌套的复合结构
dict
/
列表
结构,正如您在示例中所示

def empty(d):
如果存在(d,dict):
返回全部(d.items()中的子项为空(sub)
如果存在(d,列表):
返回全部(d中的sub为空(sub))
返回错误
这当然更短,但它仍然是递归的。钻研任意嵌套结构是一个固有的递归问题


此外,您可能会注意到,此函数消除了对任何对象的隐式
bool
属性的依赖。原因是,当一个空的
列表
[]
和空的dict
{}
计算为false时,其他类似于零的对象,例如@Heap Overflow指出的
0
0.0
'
也会计算为false,但是
val
列表不被使用,因此它不必被声明

我不能说这是对代码的显著改进,但它确实简化了一些事情并消除了语法上的糖分

def为空(d):
对于键,d.items()中的val:
如果val:
如果存在(val,dict):
返回值为空(val)
返回错误
返回真值
通过确保布尔逻辑没有不必要的卷积来简化代码是一种很好的做法。原始源代码中的代码片段就是一个很好的例子

if(未获取值(v)):
返回错误

不是双重否定,而是通过将所有内容明确化来简化

您不使用
val
,函数名
为空
无值
,这样会更好。同意,请澄清
get\u val
函数名。它究竟决定了
d
?此外,您还需要澄清
列表
s如何适合此图片。您说的是“嵌套字典”,但
列表
不是
字典
。是否要将空列表解释为结构的空部分?那么包含字典的列表可能是空的,也可能不是空的呢?谢谢,关于类零对象的观点很好。“钻研任意嵌套的结构是一个固有的递归问题”,我现在明白了。
def get_val(d):
    val = []
    for k,v in d.items():
        if (v):
            if (type(v) is dict):
                if (not get_val(v)):
                    return False
            else:
                return False
    return True