Как объединить два словаря (defaultdict), которые имеют общие ключи, но разные "уникальный идентификатор: список значений"?

В данном словаре данные defaultdict(dict) типа:

Скажи это dict1

{726: {'X': [3.5, 3.5, 2.0}, 'Y': [2.0, 0.0, 0.0], 'chr': [2, 2, 2]}, 128: {'X': [0.5, 4.0, 4.0], 'Y': [4.0, 3.5, 3.5], 'chr': [3, 3, 3]}}

dict2 является

{726: {'sum_X': [8, 0, 2], 'sum_Y': [3, 2, 0]}, 128: {'sum_X': [0.5, 2, 0], 'sum_Y': [5, 3.5, 3]}}

Ожидаемый результат:

Union_dict =

{726: {'X': [3.5, 3.5, 2.0}, 'Y': [2.0, 0.0, 0.0], 'chr': [2, 2, 2], 'sum_X': [8, 0, 2], 'sum_Y': [3, 2, 0]}, 128: {'X': [0.5, 4.0, 4.0], 'Y': [4.0, 3.5, 3.5], 'chr': [3, 3, 3], 'sum_X': [0.5, 2, 0], 'sum_Y': [5, 3.5, 3]}}

У каждого дикта есть unique key (т.е. 726, 128...) и находятся в обоих словарях (dict1 and dict2) но каждый ключ в разных словарях есть unique identifier с list values, Я хочу объединить эти словари, используя уникальные ключи, но также хочу сохранить порядок значений в списке нетронутыми и упорядоченными.

Я попробовал несколько методов, включая обширный метод в Как объединить два словаря Python в одном выражении? объяснил Aaron Hall, Я пытался изменить подходы, используя то, что я знаю о dict comprehension но его провал.

Я старался:

  • 1

    union_dict = {k: [dict1[i] for i in v] for k, v in dict2.items()}
    
  • 2

    union_dict = defaultdict(dict)
    for a,b in dict1.items(), dict2.items():
        union_dict[dict1].append(dict2)
    
  • 3

    dicts = [dict1, dict2]
    union_dict = defaultdict(dict)
    for a,b in dicts:
        union_dict[k] = tuple(union_dict[k] for d in dicts)
    

Кроме того, вы можете дать мне исчерпывающее объяснение нескольких способов сделать это и сохранить объем памяти, так как мои словари будут довольно большими.

Большое спасибо!

1 ответ

Решение

Примечание. Это решение возвращает результат в виде dict1:

for key, value in dict2.items():
    for subkey, subvalue in value.items():
        dict1[key][subkey] = subvalue

добавив все подразделы в dict1, Если есть конфликты (соответствующие подразделы, dict1s будет перезаписан dict2,

>>> dict1
{128: {'Y': [4.0, 3.5, 3.5], 'X': [0.5, 4.0, 4.0], 'chr': [3, 3, 3], 'sum_Y': [5, 3.5, 3], 'sum_X': [0.5, 2, 0]}, 
 726: {'Y': [2.0, 0.0, 0.0], 'X': [3.5, 3.5, 2.0], 'chr': [2, 2, 2], 'sum_Y': [3, 2, 0], 'sum_X': [8, 0, 2]}}

Если вы хотите сохранить dict1просто используйте copy.deepcopy(), а затем добавьте к этому новому dict.

Другие вопросы по тегам