Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to merge multiple dicts with same key or different key?

I have multiple dicts/key-value pairs like this:

d1 = {key1: x1, key2: y1}   d2 = {key1: x2, key2: y2}   

I want the result to be a new dict (in most efficient way, if possible):

d = {key1: (x1, x2), key2: (y1, y2)}   

Actually, I want result d to be:

d = {key1: (x1.x1attrib, x2.x2attrib), key2: (y1.y1attrib, y2.y2attrib)}   

If somebody shows me how to get the first result, I can figure out the rest.

like image 347
Salil Avatar asked May 10 '11 06:05

Salil


People also ask

How do I combine multiple Dicts?

Python 3.9 has introduced the merge operator (|) in the dict class. Using the merge operator, we can combine dictionaries in a single line of code. We can also merge the dictionaries in-place by using the update operator (|=).

Can we have two same keys with different values?

You can't. Keys have to be unique.

Can dictionaries have same keys?

No, each key in a dictionary should be unique. You can't have two keys with the same value. Attempting to use the same key again will just overwrite the previous value stored. If a key needs to store multiple values, then the value associated with the key should be a list or another dictionary.


2 Answers

Here's a general solution that will handle an arbitrary amount of dictionaries, with cases when keys are in only some of the dictionaries:

from collections import defaultdict  d1 = {1: 2, 3: 4} d2 = {1: 6, 3: 7}  dd = defaultdict(list)  for d in (d1, d2): # you can list as many input dicts as you want here     for key, value in d.items():         dd[key].append(value)  print(dd) 

Shows:

defaultdict(<type 'list'>, {1: [2, 6], 3: [4, 7]}) 

Also, to get your .attrib, just change append(value) to append(value.attrib)

like image 108
Eli Bendersky Avatar answered Oct 08 '22 07:10

Eli Bendersky


assuming all keys are always present in all dicts:

ds = [d1, d2] d = {} for k in d1.iterkeys():     d[k] = tuple(d[k] for d in ds) 

Note: In Python 3.x use below code:

ds = [d1, d2] d = {} for k in d1.keys():   d[k] = tuple(d[k] for d in ds) 

and if the dic contain numpy arrays:

ds = [d1, d2] d = {} for k in d1.keys():   d[k] = np.concatenate(list(d[k] for d in ds)) 
like image 37
blubb Avatar answered Oct 08 '22 07:10

blubb