我目前正在使用字典理解中的列表理解来检测列表为值的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]
的某些事情,我可以在创建密钥:值条目之前对其进行验证。
有没有办法用我正在使用的当前方法做到这一点?
答案 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)}