欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python字典列表过滤器

程序员文章站 2022-04-05 23:16:23
[toc] 字典列表过滤器 需求 需求中对 获取到的字典列表根据关键字进行过滤, 筛选符合条件的数据 支持单个字段, 单个或多个数据过滤 支持多个字段 示例 原始数据 过滤条件如下 最终结果 代码 代码如下 使用copy 是因为字列表字典中 每个元素都是字典, 而字典属于引用性类型, 整个列表也就变 ......

目录

字典列表过滤器

需求

需求中对 获取到的字典列表根据关键字进行过滤, 筛选符合条件的数据

  • 支持单个字段, 单个或多个数据过滤

    {
    	"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
    
    • 使用copy 是因为字列表字典中 每个元素都是字典, 而字典属于引用性类型, 整个列表也就变成了引用性类型, 当进行remove操作时, 原始的列表也会更改