Home > Blockchain >  How to merge keys of dictionary which have the same value?
How to merge keys of dictionary which have the same value?

Time:01-12

I need to combine two dictionaries by their value, resulting in a new key which is the list of keys with the shared value. All I can find online is how to add two values with the same key or how to simply combine two dictionaries, so perhaps I am just searching in the wrong places.

To give an idea:

dic1 = {'A': 'B', 'C': 'D'}
dic2 = {'D': 'B', 'E': 'F'}

Should result in:

dic3 = {['A', 'D']: 'B', 'C': 'D', 'E': 'F'}

CodePudding user response:

I am not sure why you would need such a data structure, you can probably find a better solution to your problem. However, just for the sake of answering your question, here is a possible solution:

dic1 = {'A':'B', 'C':'D'}
dic2 = {'D':'B', 'E':'F'}


key_list = list(dic2.keys())
val_list = list(dic2.values())

r = {}
for k,v in dic1.items():
    if v in val_list:
        i = val_list.index(v) #get index at value
        k2 = key_list[i] #use index to retrive the key at value
        r[(k, k2)] = v #make the dict entry
    else:
        r[k] = v

val_list = list(r.values()) #get all the values already processed
for k,v in dic2.items():
    if v not in val_list: #if missing value
        r[k] = v #add new entry
        
print(r)

output:

{('A', 'D'): 'B', 'C': 'D', 'E': 'F'}

You can't assign a list as a key in a python dictionary since the key must be hashable and a list is not an ashable object, so I have used a tuple instead.

CodePudding user response:

I would use a defaultdict of lists and build a reversed dict and in the end reverse it while converting the lists to tuples (because lists are not hashable and can't be used as dict keys):

from collections import defaultdict

dic1 = {'A':'B', 'C':'D'}
dic2 = {'D':'B', 'E':'F'}

temp = defaultdict(list)
for d in (dic1, dic2):
    for key, value in d.items():
        temp[value].append(key)
print(temp)

res = {}
for key, value in temp.items():
    if len(value) == 1:
        res[value[0]] = key
    else:
        res[tuple(value)] = key

print(res)

The printout from this (showing the middle step of temp) is:

defaultdict(<class 'list'>, {'B': ['A', 'D'], 'D': ['C'], 'F': ['E']})
{('A', 'D'): 'B', 'C': 'D', 'E': 'F'}

If you are willing to compromise from 1-element tuples as keys, the second part will become much simpler:

res = {tuple(value): key for key, value in temp.items()}
  •  Tags:  
  • Related