Python:从字典列表中筛选列表项

时间:2014-11-27 12:00:17

标签: python list dictionary

 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中是常见的。而且我也可以打印那些不存在的名字。

2 个答案:

答案 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'}