代码之家  ›  专栏  ›  技术社区  ›  Tri

如何合并同一个键的值并将其从列表中删除

  •  0
  • Tri  · 技术社区  · 6 年前

    我有一份字典清单:

    [
        {
            '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}
            ]
        ]
    }
    

    仍然不是完美的结果。

    我还试着用熊猫和老鼠 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
                     }
                ]
        },
    ]
    

    合并第一个结果中的值。

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

    0 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    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}]}]