Объединять или объединять словари, основанные на более чем одном ключе или нескольких ключах - PullRequest
0 голосов
/ 27 апреля 2018

Я искал все утро, но большинство примеров слияния основывалось только на одном ключе, я не мог найти ничего на нескольких ключах.

x = [
    {'pid':111, 'sid':6, 'eid':123, 'x_qty':30},
    {'pid':222, 'sid':56, 'eid':6212, 'x_qty':2}
    ]

y = [
    {'pid':111, 'sid':6, 'eid':123, 'y_qty':123},
    {'pid':333, 'sid':56, 'eid':6212, 'y_qty':112}
    ]

Значения pid = 111, sid = 6, eid = 123 совпадают по x и y, затем объединяются в одну запись. Если они не совпадают, просто внесите их как есть.

ЗАКЛЮЧИТЕЛЬНЫЕ РЕЗУЛЬТАТЫ, КОТОРЫЕ Я ХОЧУ:

z = [
    {'pid': 111, 'sid': 6, 'eid': 123, 'x_qty': 30, 'y_qty': 123},
    {'pid': 222, 'sid': 56, 'eid': 6212, 'x_qty': 2},
    {'pid': 333, 'sid': 56, 'eid': 6212, 'y_qty': 112}
    ]

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вот альтернативный вариант использования сторонней библиотеки pandas, которая принимает список словарей.

import pandas as pd

# merge data
merged = pd.DataFrame(x).merge(pd.DataFrame(y), how='outer')

# iterate, remove nan, convert to int
res = [s.dropna().astype(int).to_dict() for _, s in merged.iterrows()]

[{'eid': 123, 'pid': 111, 'sid': 6, 'x_qty': 30, 'y_qty': 123},
 {'eid': 6212, 'pid': 222, 'sid': 56, 'x_qty': 2},
 {'eid': 6212, 'pid': 333, 'sid': 56, 'y_qty': 112}]
0 голосов
/ 27 апреля 2018

Это перезапуск кортежа:

>>> from operator import itemgetter
>>> from collections import defaultdict
>>> data = defaultdict(dict)
>>> f = itemgetter('pid', 'sid', 'eid')
>>> for d in [*x, *y]:
...     data[f(d)].update(d)
...     
>>> list(data.values())
[{'eid': 123, 'pid': 111, 'sid': 6, 'x_qty': 30, 'y_qty': 123},
 {'eid': 6212, 'pid': 222, 'sid': 56, 'x_qty': 2},
 {'eid': 6212, 'pid': 333, 'sid': 56, 'y_qty': 112}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...