如何检查字典理解中的列表理解中的列表是否为空?

How can I check if a list in a list comprehension inside a dictionary comprehension is empty?

我目前在字典理解中使用列表理解来检测两个以列表作为值的字典之间的变化。

代码看起来像这样:

detectedChanges = {table: [field for field in tableDict[table] if field not in fieldBlackList] for table in modifiedTableDict if table not in tableBlackList}

这将创建一个字典,其中每个条目都是 table 名称,并且与之关联的是一个列表更改。

我遇到的问题是,尽管此代码有效,但生成的结构 detectedChanges 充满了仅包含 table 名称和空列表的条目(意味着没有检测到任何变化)。

我目前正在对字典进行后验扫描以删除这些条目,但我想首先避免将它们放入字典中。

基本上,如果我能以某种方式进行长度检查或超过 [field for field in tableDict[table] 的事情,我可以在创建 key:value 条目之前对其进行验证。

有没有办法用我目前使用的方法做到这一点?

虽然听写推导很酷,但不应该被滥用。下面的代码不会太长,也可以保留在窄屏上:

detectedChanges = {}
for table, fields in modifiedTableDict.iteritems():
    if table not in tableBlackList:
        good_fields = [field for field in fields
                             if field not in fieldBlackList]
        if good_fields:
            detectedChanges[table] = good_fields

只是对 的补充。请首先使用他们的答案,因为它更具可读性。但是,如果我没记错的话,理解通常更快,所以有一个用例,但 仅当这是您代码中的瓶颈时 。我怎么强调都不为过。

detectedChanges = {table: [field for field in tableDict[table]
                           if field not in fieldBlackList]
                   for table in modifiedTableDict
                   if table not in tableBlackList
                   if set(tableDict[table])-set(fieldBlackList)}

注意这有多难看。我喜欢做这样的事情来更好地理解 Python,因为我以前遇到过这样的事情成为瓶颈。但是,在尝试解决可能不存在的问题之前,您应该始终 use profiling

添加到您的代码 [...] if set(tableDict[table])-set(fieldBlackList) [...] 会在当前 table 中创建一组条目和一组列入黑名单的字段并获取当前 [=28= 中的条目] 但不是黑名单。空集计算为 False 导致理解忽略 table,就好像它在 tableBlackList 变量中一样。为了使它更明确,可以将结果与空集进行比较,或者检查它是否有值。

此外,为了速度,更喜欢以下内容:

detectedChanges = {table: [field for field in fields
                           if field not in fieldBlackList]
                   for table, fields in modifiedTableDict.iteritems()
                   if table not in tableBlackList
                   if set(fields)-set(fieldBlackList)}