【问题标题】:Filtering list of dicts based on a key value in python根据python中的键值过滤dicts列表
【发布时间】:2021-11-25 15:08:15
【问题描述】:

我在 python 中有一个字典列表,如下所示

 list = [{'entityType': 'source', 'databaseName': 'activities', 'type': 'POSTGRES', 'children': [{'id': '3c144414-0c73-41df-9f0e-4dd7cb5af46e',
       'path': ['Activities (DEV)', 'public'],
       'type': 'CONTAINER',
       'containerType': 'FOLDER'}]'checkTableAuthorizer': False}, 
       {'entityType': 'source', 'databaseName': 'pd-prod-dev', 'type': 'POSTGRES', 'children': 
        [{'id': '75d84ead-a9fe-4949-bc21-d4deb34e1ae1',
       'path': ['pg-prd (DEV-RR)', 'pghero'],
       'tag': 'PWGqdrkcD08=',
       'type': 'CONTAINER',
       'containerType': 'FOLDER'},
      {'id': 'facc2c20-7561-430f-ac35-547b5bc7a92f',
       'path': ['pg-prd (DEV-RR)', 'public'],
       'tag': 'gcUL0NTOc+4=',
       'type': 'CONTAINER',
       'containerType': 'FOLDER'}]'checkTableAuthorizer': False},
 {'entityType': 'source', 'databaseName': 'pd-prod-prd', 'type': 'POSTGRES', 'children': 
        [{'id': '75d84ead-a9fe-4949-bc21-d4deb34e1ae1',
       'path': ['pg-prd (PRD-RR)', 'pghero'],
       'tag': 'PWGqdrkcD08=',
       'type': 'CONTAINER',
       'containerType': 'FOLDER'},
      {'id': 'facc2c20-7561-430f-ac35-547b5bc7a92f',
       'path': ['pg-prd (PRD-RR)', 'public'],
       'tag': 'gcUL0NTOc+4=',
       'type': 'CONTAINER',
       'containerType': 'FOLDER'}]'checkTableAuthorizer': False}]

这只是一个示例。实际列表有 30 个字典的列表。我想要做的是过滤掉嵌套 children 字典只有 'public' 架构的字典在里面。所以我的预期输出是

     public_list = [{'entityType': 'source', 'databaseName': 'activities', 'type': 'POSTGRES', 'children': [{'id': '3c144414-0c73-41df-9f0e-4dd7cb5af46e',
           'path': ['Activities (DEV)', 'public'],
           'type': 'CONTAINER',
           'containerType': 'FOLDER'}]'checkTableAuthorizer': False}, 
           {'entityType': 'source', 'databaseName': 'pd-prod-dev', 'type': 'POSTGRES', 'children': 
            [{'id': 'facc2c20-7561-430f-ac35-547b5bc7a92f',
           'path': ['pg-prd (DEV-RR)', 'public'],
           'tag': 'gcUL0NTOc+4=',
           'type': 'CONTAINER',
           'containerType': 'FOLDER'}]'checkTableAuthorizer': False},
 {'entityType': 'source', 'databaseName': 'pd-prod-prd', 'type': 'POSTGRES', 'children': 
            [{'id': 'facc2c20-7561-430f-ac35-547b5bc7a92f',
           'path': ['pg-prd (PRD-RR)', 'public'],
           'tag': 'gcUL0NTOc+4=',
           'type': 'CONTAINER',
           'containerType': 'FOLDER'}]'checkTableAuthorizer': False}]

我尝试通过迭代访问嵌套的 dict 子级,但无法过滤掉要使用的条件

for d in list:
    for k, v in d.items():
        if k == 'children':
            print(v)

我很想将它作为一个函数应用,因为我将在字典列表的 pandas 列上重用它

【问题讨论】:

  • 您发布的示例不是有效列表。

标签: python-3.x pandas list dataframe


【解决方案1】:

您可以创建一个函数来获取每个条目的children 的公共数据:

def get_public_data(data):
    result = []
    children = data.get("children")
    if children:
        for row in children:
            path = row.get("path")
            if path and "public" in path:
                result.append(row)
    return result

然后创建一个新的条目列表,您只需替换 children 键:

public_list = []
for x in entities:
    public_data = get_public_data(x)
    if public_data:
        public_list.append({**x, "children": public_data})

结合这两者,你会得到你需要的功能。

【讨论】:

  • 这个解决方案有效!!谢谢
【解决方案2】:

您要收集的 IIUC 条目是否所有项目都具有公共架构?

假设您的“子”键始终有效且包含 2 个元素的元组,您可以使用简单的理解:

[d for d in lst
 if all(e['path'][1] == 'public' for e in d['children'])
]

注意。我称你的输入为lst,因为list 是一个内置的python

【讨论】:

  • 元素可能会有所不同。有时我可能有多个架构
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2017-12-27
  • 2021-09-06
  • 2019-09-03
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多