基于重复值,将字典列表合并为较小的字典列表

4

我有一个关于字典列表的问题,让我来演示一下我的问题。这是一个样本字典列表:

[{'a' : '1'}, {'b' : 'something'}, {'c' : 'else'},
 {'a' : '2'}, {'b' : 'anything'}, {'c' : 'if'},
 {'a' : '3'}, {'b' : 'nothing'}, {'c' : 'matters'}]

您可以看到,我已经将字典分开了,但我想要合并它们。条件是当字典名重复时,应该是一个单独的字典。像这样:

list_of_dict = 
[{'a' : '1', 'b' : 'something', 'c' : 'else'},
 {'a' : '2', 'b' : 'anything', 'c' : 'if'},
 {'a' : '3', 'b' : 'nothing', 'c' : 'matters'}]

我一直在尝试使用dict(ChainMap(*list_of_dict)),但它只会返回:
{'c': 'else', 'b': 'something', 'a': '1'}

我在考虑是否可以使用for循环来解决我的问题,但不知道如何开始。你们有什么想法吗?

1个回答

4
这可以通过使用for循环来完成,迭代list_of_dict并检查字典中的键是否在返回列表中的最新字典中。如果不在,则使用**运算符将其附加到最新字典中,以合并字典,否则在返回列表中启动一个新字典。

代码:

list_of_dict = [{'a' : '1'}, {'b' : 'something'}, {'c' : 'else'},
                {'a' : '2'}, {'b' : 'anything'}, {'c' : 'if'},
                {'a' : '3'}, {'b' : 'nothing'}, {'c' : 'matters'}]

rv = [{}]

for d in list_of_dict:
    if list(d)[0] not in rv[-1]:
        rv[-1] = {**rv[-1], **d}
    else:
        rv.append(d)

输出:

>>> rv
[{'a': '1', 'b': 'something', 'c': 'else'},
 {'a': '2', 'b': 'anything', 'c': 'if'},
 {'a': '3', 'b': 'nothing', 'c': 'matters'}]

你认为可以使用列表和字典推导来完成这个任务吗? - Celius Stingher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接