I need to merge two dictionaries d1 and d2, where:
d1 = {0: [array([ 42.9017, -78.6631]), array([ 41.5372, -74.0526]), array([ 39.8017, -89.6437])], 1: [array([ 34.7269, -86.5673]), array([ 29.7229, -98.0742])], 2: [array([ 35.9878, -115.1167]), array([ 34.0316, -117.6187])],array([ 61.6303, -148.9872])]} d2 = {0: [array([5, 5], dtype=int64), array([44, 44], dtype=int64),array([1, 1], dtype=int64)], 1: [array([1, 1], dtype=int64), array([12, 12], dtype=int64), array([1, 1], dtype=int64)], 2: [array([1, 1], dtype=int64), array([12, 12], dtype=int64), array([1, 1], dtype=int64)]}
I need dictionary d3 after merging d1 and d2, such that, 1st value of key:0 of d1 is merged with 1st value of key:0 of d2.
Expecting d3 as:
d3 = {0: [array([ 42.9017, -78.6631]), array([5, 5], dtype=int64), array([ 41.5372, -74.0526]), array([44, 44], dtype=int64) , array([ 39.8017, -89.6437]), array([1, 1], dtype=int64)], 1: [array([ 34.7269, -86.5673]), array([1, 1], dtype=int64), array([ 29.7229, -98.0742]), array([12, 12], dtype=int64)], 2: [array([ 35.9878, -115.1167]),array([1, 1], dtype=int64),array([1, 1], dtype=int64), array([12, 12], dtype=int64), array([ 34.0316, -117.6187])],array([1, 1], dtype=int64), array([ 61.6303, -148.9872])]}
I have tried multiple approaches, but nothing seems to work appropriately. Any help is much appreciated! Thanks!
Advertisement
Answer
I hope I’ve understood your question well. You can use itertools.zip_longest
to alternate between the values from the two dictionaries:
from itertools import zip_longest out = {} for k in d1.keys() | d2.keys(): for v1, v2 in zip_longest(d1.get(k, []), d2.get(k, [])): out.setdefault(k, []) if not v1 is None: out[k].append(v1) if not v2 is None: out[k].append(v2) print(out)
Prints:
{ 0: [ array([42.9017, -78.6631]), array([5, 5]), array([41.5372, -74.0526]), array([44, 44]), array([39.8017, -89.6437]), array([1, 1]), ], 1: [ array([34.7269, -86.5673]), array([1, 1]), array([29.7229, -98.0742]), array([12, 12]), array([1, 1]), ], 2: [ array([35.9878, -115.1167]), array([1, 1]), array([34.0316, -117.6187]), array([12, 12]), array([61.6303, -148.9872]), array([1, 1]), ], }