按另一个词典的嵌套id筛选词典列表

2024-09-28 05:15:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要通过从另一个字典(relationships)嵌套id来归档字典(includes)列表

以下是测试数据:

relationships = {
    'author': {
        'data': {
            'type': 'users',
            'id': '22DB1A00-0000-0000-00009BC6',
        }
    },
    'parent': {
        'data': {
            'type': 'documents',
            'id': 'BE7F4800-0000-0000-000021F6',
        }
    },
    'pages_file': {
        'data': None
    },
    'fields': {
        'data': [
            {
                'type': 'dictionary',
                'id': 'B15E5D00-0000-0000-000021F6-0001',
            },
            {
                'type': 'dictionary',
                'id': 'B15E5D00-0000-0000-000021F6-0002',
            },
        ]
    },
}

includes = [
    {'type': 'users', 'id': '22DB1A00-0000-0000-00009BC6'},
    {'type': 'dictionary', 'id': 'B15E5D00-0000-0000-000021F6-0002'},
    {'type': 'dictionary', 'id': 'B15E5D00-0000-0000-000021F6-0003'},
]

我需要的结果如下所示:

[{'type': 'users', 'id': '22DB1A00-0000-0000-00009BC6'},
 {'type': 'dictionary', 'id': 'B15E5D00-0000-0000-000021F6-0002'}]

澄清一下:我想在过滤后得到的新字典应该与来自relationships的嵌套dict具有相同的idtype


Tags: id列表datadictionary字典typeusersdocuments
1条回答
网友
1楼 · 发布于 2024-09-28 05:15:52

以下是我的实现:

def filter_includes(relationships, includes):
    def normalize(data):
        if data is None:
            return []
        return data if isinstance(data, list) else [data]

    def simplify(r):
        return ((d['type'], d['id']) for i in r for d in normalize(r[i]['data']))

    r_set = set(simplify(relationships))

    return [e for e in includes if (e['type'], e['id']) in r_set]

测试:

def test_filter_includes():
    result = filter_includes(relationships, includes)
    assert len(result) == 2
    assert result[0]['id'] == '22DB1A00-0000-0000-00009BC6'
    assert result[1]['id'] == 'B15E5D00-0000-0000-000021F6-0002'

    result = filter_includes({}, includes)
    assert len(result) == 0

    includes[0]['type'] = 'content_file'
    includes[1]['type'] = 'content_file'
    includes[2]['type'] = 'content_file'

    result = filter_includes(relationships, includes)
    assert len(result) == 0

    includes[0]['type'] = 'documents'
    includes[0]['id'] = 'BE7F4800-0000-0000-000021F6'

    result = filter_includes(relationships, includes)
    assert len(result) == 1
    assert result[0]['type'] == 'documents'
    assert result[0]['id'] == 'BE7F4800-0000-0000-000021F6'

相关问题 更多 >

    热门问题