Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
618 views
in Technique[技术] by (71.8m points)

python - Combine or merge dictionaries based on more than one key or multi keys

I've been searching all morning but most examples of merging was based on only one key, I couldn't find anything on multiple keys.

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

Values of pid=111, sid=6, eid=123 match in both x and y, then combine as one record. If they don't match, just bring it over as is.

FINAL RESULTS THAT I WANT:

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}
    ]
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This is re-keying off a tuple:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...