Как объединить список словарей с дубликатами ключей - PullRequest
1 голос
/ 21 сентября 2019

У меня есть список словарей:

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

Я хочу объединить значения с одинаковыми ключами и удалить дубликаты.

Я пробовал следующий код :

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

не идеальный результат, значения месяца все еще имеют дубликаты.

Затем я попробовал это следующий код :

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

Все еще не идеальный результат ^ _ ^.

Я также пытался использоватьПанды с следующий код :

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

, где объединяются значения из первого результата.

Итак, как это сделать ..?, Любая помощь будет оценена:)

1 Ответ

2 голосов
/ 21 сентября 2019

Идея состоит в том, чтобы сначала создать набор кортежей с выравниванием:

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}]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...