Python:从字典列表中筛选列表项
使用这个列表/听写理解,我得到了我想要的结果。但是我还想打印Python:从字典列表中筛选列表项,python,list,dictionary,Python,List,Dictionary,使用这个列表/听写理解,我得到了我想要的结果。但是我还想打印vapp1和vapp4不在vapps中 最有效的方法是什么?或者如何避免额外的循环以实现所有这些,这样我将得到一个字典的过滤列表,其名称在列表名称中是常见的。我还可以打印那些不在那里的名字。你可以滥用的短路,就像这样: names = ['vapp1', 'vapp3', 'vapp4', 'vapp2'] vapps = [{'name':'vapp2', 'ip': '11.21.18.24', 'obj': 'obj523'}
vapp1
和vapp4
不在vapps
中
最有效的方法是什么?或者如何避免额外的循环以实现所有这些,这样我将得到一个字典的过滤列表,其名称在列表名称中是常见的。我还可以打印那些不在那里的名字。你可以滥用的短路,就像这样:
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
这将产生与以前相同的结果列表,并修改名称
,因此它会删除找到的vapp名称作为副作用
这是因为只有当语句的第一部分(vapp['name']在names
中)为True
时,才会计算和
子句。需要或1
部分,因为.remove()
产生None
,在布尔上下文中为False
不过,有副作用的列表理解通常不被认为是糟糕的风格,而且您的名称
列表会被修改,所以如果您再次需要,最好保存一份副本
一般来说,不要担心性能,只需使用两个循环,或者在可读的经典循环中写出
只要使用一些集合属性,我们就可以得到它
vapps_name=[vapp['name']用于vapps中的vapp]
现在
值不是在VAPP中,而是在名称中
not_in_vapps=集合(名称)-集合(vapps_名称)
{'vapp1','vapp4'}
名称中的值不在VAPP中
not_in_names=set(vapps_names)-set(names)
{'vapp5'}
你能把你的问题说清楚一点吗<代码>结果=[vapp for vapp in vapp if vapp['name']in names]
将打印存在的内容(您的代码本身),并且结果=[vapp for vapp in vapp if vapp['name']in names]
将打印不存在的内容(这是您想要的)。详细说明这个问题。你是对的!答案是“一般来说,不必担心性能,只需使用两个循环——或者在可读的经典循环中写出。”
>>> 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']