需求中对 获取到的字典列表根据关键字进行过滤, 筛选符合条件的数据
支持单个字段, 单个或多个数据过滤
{ "name": [ "m1.large","m1.xlarge","wangjw"] } # 过滤字段 "name", 满足列表中的任意一个即可
支持多个字段
{ "name":[ "m1.large","m1.xlarge","wangjw"], "ram": 4096 } # 必须同时满足 name, ram字段 对应的value值
原始数据
d = [ { 'disk': 1, 'id': '1', 'is_disabled': false, 'is_public': true, 'name': 'm1.tiny', 'ram': 512, 'vcpus': 1 }, { 'disk': 20, 'id': '2', 'is_disabled': false, 'is_public': true, 'name': 'm1.small', 'ram': 2048, 'vcpus': 1 }, { 'disk': 40, 'id': '3', 'is_disabled': false, 'is_public': true, 'name': 'm1.medium', 'ram': 4096, 'vcpus': 2 }, { 'disk': 80, 'id': '4', 'is_disabled': false, 'is_public': true, 'name': 'm1.large', 'ram': 8192, 'vcpus': 4 }, { 'disk': 160, 'id': '5', 'is_disabled': false, 'is_public': true, 'name': 'm1.xlarge', 'ram': 16384, 'vcpus': 8 }, { 'disk': 50, 'id': 'abb677c9-1bf2-415d-97bd-ef62574690ed', 'is_disabled': false, 'is_public': true, 'name': 'wangjw', 'ram': 4096, 'vcpus': 2 }, ... ]
过滤条件如下
filters = { "name": ["m1.large", "m1.xlarge", "wangjw"], "ram": 4096 }
最终结果
[ { 'disk': 50, 'id': 'abb677c9-1bf2-415d-97bd-ef62574690ed', 'is_disabled': false, 'is_public': true, 'name': 'wangjw', 'ram': 4096, 'vcpus': 2 } ]
代码如下
#!/usr/bin/env python # ~*~ coding: utf-8 ~*~ def list_filter(l, filters=none): """通过特殊字段过滤原始列表字典 :param filters: 字典构建的过滤字段 格式如下 1.同一字段,匹配多个选项 { "name":[ "m1.large","m1.xlarge","wangjw"] } 2.混合模式多个字段,不同字段有独立的匹配项 { "name":[ "m1.large","m1.xlarge","wangjw"], "ram": 4096 } :param l: 目标字典列表 :return: 过滤后的列表 """ rest_l = copy.deepcopy(l) if not filters: return l for i in rest_l: for k, v in filters.items(): if isinstance(v, (list, tuple)) and i.get(k) not in v: l.remove(i) break elif not isinstance(v, (list, tuple)) and i.get(k) != v: l.remove(i) break return l
如对本文有疑问, 点击进行留言回复!!
利用Python实现串口通信--以Arduino UNO为例
网友评论