如何从词典列表中提取常用元素

问题描述 投票:0回答:1

我正在尝试从词典列表中构建字典(一个包含所有常见元素,另一个包含不同元素。

现在,通过转换为一组元组,然后获取唯一键以及使用相交和差异方法的差异,我设法使它适用于2个词典的列表,但是我不知道该怎么做关于一个长度可变的列表(有时我的列表中会有3或4个字典)。

我确定我需要使用map或reduce / lambda函数,但我无法弄清楚。

这是我的输入:

all_maps = [
    [{'key': 'target', 'value': 'true'},
     {'key': 'region_name', 'value': 'europe'},
     {'field': 'AccessToken', 'key': 'token','path': 'test/path'}],
    [{'key': 'target', 'value': 'true'},
     {'key': 'region_name', 'value': 'usa'},
     {'field': 'AccessToken', 'key': 'token', 'path': 'test/path'}],
    [{'key': 'target', 'value': 'true'},
     {'key': 'region_name', 'value': 'japan'},
     {'field': 'AccessToken', 'key': 'token', 'path': 'test/path'}]
]

我想要得到4个这样的字典:

intersection = {'key': 'target', 'value': 'true'},
               {'field': 'AccessToken', 'key': 'token', 'path': 'test/path'}
diff1 = {'key': 'region_name', 'value': 'europe'}
diff2 = {'key': 'region_name', 'value': 'usa'}
diff3 = {'key': 'region_name', 'value': 'japan'}
python list dictionary
1个回答
1
投票

一个简单的答案是将all_maps列表弄平,并根据list.count()值将每个项目分开:

def flatten(map_groups):
    items = []
    for group in map_groups:
        items.extend(group)
    return items


def intersection(map_groups):
    unique = []
    items = flatten(map_groups)
    for item in items:
        if item not in unique and items.count(item) > 1:
            unique.append(item)
    return unique


def difference(map_groups):
    unique = []
    items = flatten(map_groups)
    for item in items:
        if item not in unique and items.count(item) == 1:
            unique.append(item)
    return unique

这是使用这些功能的输出:

>>> intersection(all_maps)
[{'key': 'target', 'value': 'true'},
 {'field': 'AccessToken', 'key': 'token', 'path': 'test/path'}]

>>> difference(all_maps)
[{'key': 'region_name', 'value': 'europe'},
 {'key': 'region_name', 'value': 'usa'},
 {'key': 'region_name', 'value': 'japan'}]

对于更高级的实现,您可以查看set()

© www.soinside.com 2019 - 2024. All rights reserved.