names = ['vapp1', 'vapp3', 'vapp4', 'vapp2']
vapps = [{'name':'vapp2', 'ip': '11.21.18.24', 'obj': 'obj523'}, {'name':'vapp3', 'ip': '11.21.18.27', 'obj': 'obj234'}, {'name':'vapp5', 'ip': '11.21.18.25', 'obj': 'obj246'}]
result = [vapp for vapp in vapps if vapp['name'] in names]
print result
使用这个列表/词典理解我得到了我想要的结果。但我也要打印vapp1
& vapp4
中没有vapps
。
最有效的方法是什么?或者如何避免额外的循环来实现所有这一切,这样我将得到一个字典的过滤列表,其名称在列表names
中是常见的。而且我也可以打印那些不存在的名字。
答案 0 :(得分:1)
您可能滥用and
的短路,如此:
>>> result = [vapp for vapp in vapps if
... vapp['name'] in names and
... (names.remove(vapp['name']) or 1)]
>>> names # now contains names not found in vapps
['vapp1', 'vapp4']
这将产生与以前相同的结果列表,并修改names
,以便删除找到的vapp名称作为副作用。
这是有效的,因为and
子句仅在语句的第一部分(vapp['name'] in names
)为True
时进行评估。需要or 1
部分,因为.remove()
会产生None
,在布尔上下文中为False
。
有副作用的列表理解通常不鼓励作为坏样式 - 并且您的names
列表将被修改,因此如果您再次需要它,最好保存副本。
通常,不要担心性能,只需使用两个循环 - 或者在可读的经典循环中写出来。
答案 1 :(得分:1)
您可以执行以下操作
只使用一些我们可以得到它的设置属性
vapps_names = [vapp ['名称']适用于vapps中的vapp]
现在 值不在vapps中,而在名称
中not_in_vapps = set(names) - set(vapps_names)
{' vapp1',' vapp4'}
名称中的值不在vapps中
not_in_names = set(vapps_names) - set(names)
{' vapp5'}