get common elements in nested dictionaries

Question:

I am going to get the intersection of lists for each key.
My dictionaries are:

dict_1 = {101: [['14', '02', '03', '07', '11'], ['04', '12', '05', '06', '08'], ['10', '16', '09', '13', '01']],
          102: [['21', '19', '14', '07', '10'], ['11', '04', '09', '12', '13'], ['03', '02', '15', '08', '17']]
}

dict_2 = {101: [['12', '02', '05', '01', '16'], ['04', '03', '18', '10', '14'], ['10', '11', '08', '07', '13']],
          102: [['21', '19', '11', '07', '15'], ['08', '03', '09', '12', '13'], ['03', '02', '15', '10', '17']]
}

What I mean by intersection (for 101):

list_1 = Common elements in ['14', '02', '03', '07', '11'] and ['12', '02', '05', '01', '16']
list_2 = Common elements in ['14', '02', '03', '07', '11'] and ['04', '03', '18', '10', '14']
list_3 = Common elements in ['14', '02', '03', '07', '11'] and ['10', '11', '08', '07', '13']
list_4 = Common elements in ['04', '12', '05', '06', '08'] and ['12', '02', '05', '01', '16']
list_5 = Common elements in ['04', '12', '05', '06', '08'] and ['04', '03', '18', '10', '14']
list_6 = Common elements in ['04', '12', '05', '06', '08'] and ['10', '11', '08', '07', '13']
list_7 = Common elements in ['10', '16', '09', '13', '01'] and ['12', '02', '05', '01', '16']
list_8 = Common elements in ['10', '16', '09', '13', '01'] and ['04', '03', '18', '10', '14']
list_9 = Common elements in ['10', '16', '09', '13', '01'] and ['10', '11', '08', '07', '13']

Final output should be like this:

output = {101: [['02'], ['14', '03'], ['07', '11'], ['12', '05'], ['04'], ['08'], ['16', '01'], ['10'], ['10', '13']], 
          102: [['21', '19', '07'], [], ['10'], ['11'], ['09', '12', '13'], [], ['15'], ['03', '08'], ['03', '02', '15', '17']]
}

What is the best way to do that?

I can get all the common elements of two lists but I am not able to do that in nested dictionaries.

Asked By: Masoud

||

Answers:

You can do the following:

output = {}
for k1, v1 in dict_1.items():
    v2 = dict_2[k1]
    temp = []
    for sub_list1 in v1:
        for sub_list2 in v2:
            temp.append(list(set(sub_list1).intersection(sub_list2)))
    output[k1] = temp

print(output)

Basically you iterate over dict_1‘s value which is a list itself. For each sublist, you iterate through the sublists of the values of dict_2. With intersection you can get the common items.

This could be written as a dictionary comprehension if you prefer. Here is the complete code:

dict_1 = {
    101: [["14", "02", "03", "07", "11"],["04", "12", "05", "06", "08"],["10", "16", "09", "13", "01"],],
    102: [["21", "19", "14", "07", "10"], ["11", "04", "09", "12", "13"], ["03", "02", "15", "08", "17"]],
}

dict_2 = {
    101: [["12", "02", "05", "01", "16"],["04", "03", "18", "10", "14"],["10", "11", "08", "07", "13"],],
    102: [["21", "19", "11", "07", "15"],["08", "03", "09", "12", "13"],["03", "02", "15", "10", "17"],],
}

res = {
    k1: [
        list(set(sub_list1).intersection(sub_list2))
        for sub_list1 in v1
        for sub_list2 in dict_2[k1]
    ]
    for k1, v1 in dict_1.items()
}
print(res)

Note: Since I used set operation to get the common keys, the order of the common keys like ['14', '03'] is not guaranteed. If that’s also important to you, you should use another nested loop to check membership testing:

res = {
    k1: [
        [item for item in sub_list1 if item in sub_list2] # <-- Here
        for sub_list1 in v1
        for sub_list2 in dict_2[k1]
        
    ]
    for k1, v1 in dict_1.items()
}
print(res)
Answered By: S.B
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.