【问题标题】:How to merge a list of dictionaries with duplicate keys如何合并具有重复键的字典列表
【发布时间】:2020-01-22 00:45:14
【问题描述】:

我有一个字典列表:

[
    {
        'Tahsin': [
            {'January': 1}
        ]
    },
    {
        'Arabic Language': [
            {'September': 1}
        ]
    },
    {
        'Arabic Language': [
            {'August': 2}
        ]
    },
    {
        'Arabic Language': [
            {'August': 2}
        ]
    }
]

我想合并相同键下的值并删除重复项。

我试过这个following code

list_of_unique_dicts = []
for dict_ in student_per_course:
    if dict_ not in list_of_unique_dicts:
       list_of_unique_dicts.append(dict_)

我得到了结果:

[
    {
        'Tahsin': [
            {'January': 1}
        ]
    }, 
    {'Arabic Language': [
        {'September': 1}
        ]
    },
    {
        'Arabic Language': [
            {'August': 2}
        ]
    }
]

结果不完美,月份的数值还是有重复的。

然后,我尝试了这个following code

bar = {
        k: [d.get(k) for d in list_of_unique_dicts]
        for k in set().union(*list_of_unique_dicts)
    }

得到了这个结果:

{
    'Tahsin': [
        [
            {'January': 1}
        ],
        None, None
    ], 
    'Arabic Language': [
        None, 
        [
            {'September': 1}
        ],
        [
            {'August': 2}
        ]
    ]
}

仍然不是完美的结果^_^。

我还尝试将 Pandas 与 following code 一起使用:

res = pd.DataFrame(list_of_unique_dicts).to_dict(orient='list')

得到了这个结果:

{
    'Tahsin': [
        [
            {'January': 1}
        ], 
        nan, nan
    ], 
    'Arabic Language': [
        nan, 
        [
            {'September': 1}
        ],
        [
            {'August': 2}
        ]
    ]
}

以上仍然不是我想要的结果。

预期的结果应该是:

[
    {
        'Tahsin': [
            {'January': 1}
        ]
    },
    {
        'Arabic Language':
            [
                {'September': 1,
                 'August': 2
                 }
            ]
    },
]

第一个结果的值被合并的地方。

那么,如何做到这一点..?,任何帮助将不胜感激:)

【问题讨论】:

  • 一个选项是创建一个类似于您的第二种方法的中间字典(不是字典列表)。循环遍历list_of_unique_dicts中的所有条目,如果中间dict中不存在该条目的key,则添加它,否则更新中间dict中的值。然后最后,您可以将此中间字典转换为字典列表。试试这个并发布结果。

标签: python arrays pandas list dictionary


【解决方案1】:

Ide 是首先通过扁平化创建一组元组:

L = set([(k, k1, v1) for d in L for k, v in d.items() for y in v for k1, v1 in y.items()])
print (L)
{('Arabic Language', 'August', 2), 
 ('Tahsin', 'January', 1), 
 ('Arabic Language', 'September', 1)}

然后转换回你的结构:

from collections import defaultdict
out = defaultdict(dict)
for a,b,c in L:
    out[a][b] = c

out = [{k: [v] for k, v in out.items()}]
print(out)
[{'Arabic Language': [{'August': 2, 'September': 1}], 'Tahsin': [{'January': 1}]}]

【讨论】:

    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多