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

时间:2019-11-12 16:20:41

标签: python list dictionary

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

现在,通过转换为一组元组,然后通过交集和差异方法获取唯一键以及差异,我设法使它适用于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'}

1 个答案:

答案 0 :(得分: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()