Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从字典列表中筛选列表项_Python_List_Dictionary - Fatal编程技术网

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']