Python:检查列表中的所有字典是否为空

10
我有一个字典列表。我需要检查该列表中的所有字典是否为空。我正在寻找一个简单的语句来在一行内完成此操作。
有没有一种单行的方法来执行以下操作(不包括打印)?
l = [{},{},{}] # this list is generated elsewhere...
all_empty = True
for i in l:
  if i:
    all_empty = False

print all_empty

我在 Python 方面还比较新手......不知道是否有内置的简写方法来进行检查。提前谢谢。

3个回答

26
all(not d for d in l)

另外all(len(d) == 0 for d in l),更详细地说明了“空”的含义。 - S.Lott
更详细并不意味着更符合Python风格,这就是为什么我更喜欢Jimmy的版本。 - Jürgen A. Erhard

10

not any(d for d in l)在这种情况下可以简写为not any(l)


9

not any(d for d in l)等价于德摩根定律all(not d for d in l),但只适用一个not运算符。短路行为也是等价的。

编辑1:内部生成器表达式实际上是(无害但)冗余的:not any(l)更快且更简洁。

编辑2:一条评论声称all(not d for d in l)not any(l)“更能表达你想要表达的内容”,我强烈反对:即使在自然语言中,“列表的所有项都未被填充”也不比“列表中没有任何项被填充”更正常、直接或清晰——除了绝对的逻辑等价性外,这两种表达方式非常接近,在人类心理方面也大致相当。


7
“not any(l)”足够了。 - unbeknown
1
哇,有人超越了martellibot ;D - Jürgen A. Erhard
虽然这是一个老问题:Jimmy's更接近于你想要表达的意思(所有的空),而not any(l)则可能更快(尚未测量)。 - Jürgen A. Erhard
@unbeknown,没错——内部genexp是(无害但)多余的,我会编辑并指出这一点。@jae,为什么“没有项目被填充”比“所有项目都未被填充”更符合你实际想表达的意思?在自然语言和思维模式上,它们大致相当,并且根据逻辑规律完全相同。 - Alex Martelli
在Python中,我喜欢“not any(l)”相对于“all(not d for d in l)”的阅读方式,但在英语中,“all are empty”是我首选的写法,与“none are not empty”相比。 “populated”和“unpopulated”是足够大的词来掩盖这种差异。 - Jimmy
“true”和“false”(分别翻译为“非空”或“已填充”,以及“空”或“未填充”,对于容器来说是这样,但对于非容器则有其他方式)是更好的(而且是单音节!)选择——使用not明显将注意力集中在真实性上,而不是空值。因此,选择是“全部为false”与“没有一个为true”的区别,这又是一个平手。 - Alex Martelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接