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

时间:2015-02-04 16:16:53

标签: python list-comprehension dictionary-comprehension

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

代码看起来像这样:

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

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

我遇到的问题是,尽管此代码有效,但生成的结构 detectedChanges 将填充仅包含表名和空列表的条目(意味着未检测到任何更改)。

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

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

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

2 个答案:

答案 0 :(得分:1)

尽管字典理解很酷,但不应该滥用它们。以下代码不会太长,也可以保存在狭窄的屏幕上:

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

答案 1 :(得分:0)

只是eumiro's answer的补充。请先使用他们的答案,因为它更具可读性。但是,如果我没有误解,理解通常会更快,所以有一个用例,但只有这是你的代码中的BOTTLENECK 。我不能强调这一点。

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) [...]会在当前表中创建一组条目,并在一组列入黑名单的字段中获取当前表中的条目,但不会获取黑名单中的条目。空集评估为False,导致理解忽略该表,就像它在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)}