obj1 = {
'ZZZ': {
'A': [100, 200, 300],
'B': [400],
'C': [500]
},
'YYY': {
'A': [100],
'B': [200, 300, 400],
'C': [500]
},
'XXX': {
'A': [100],
'B': [200, 300],
'C': [400, 500]
}
}
obj2 = {
'100': {
'A': ['ZZZ', 'YYY', 'XXX'],
'B': [],
'C': [],
},
'200': {
'A': ['ZZZ'],
'B': ['YYY', 'XXX'],
'C': [],
},
'300': {
'A': ['ZZZ'],
'B': ['YYY', 'XXX'],
'C': [],
},
'400': {
'A': [],
'B': ['ZZZ', 'YYY'],
'C': ['XXX'],
},
'500': {
'A': [],
'B': [],
'C': ['ZZZ', 'YYY', 'XXX'],
},
}
result = {}
letters_cache = set()
# iterate over first layer (XXX, YYY, ZZZ)
for group, letters in obj1.iteritems():
# iterate over second layer (A, B, C)
for letter, numbers in letters.iteritems():
# iterate over numbers
letters_cache.add(letter)
for num in numbers:
str_num = str(num)
# set up number as top level key
result[str_num] = result.get(str_num, {})
# set up letter as second level key
result[str_num][letter] = result[str_num].get(letter, [])
# set append group name
result[str_num][letter].append(group)
# append missed letter to result
for number, letter_group in result.iteritems():
for letter in letters_cache:
if letter not in letter_group:
letter_group[letter] = []
print(result)
b2JqMSA9IHsKICAgICdaWlonOiB7CiAgICAgICAgJ0EnOiBbMTAwLCAyMDAsIDMwMF0sCiAgICAgICAgJ0InOiBbNDAwXSwKICAgICAgICAnQyc6IFs1MDBdCiAgICB9LAogICAgJ1lZWSc6IHsKICAgICAgICAnQSc6IFsxMDBdLAogICAgICAgICdCJzogWzIwMCwgMzAwLCA0MDBdLAogICAgICAgICdDJzogWzUwMF0KICAgIH0sCiAgICAnWFhYJzogewogICAgICAgICdBJzogWzEwMF0sCiAgICAgICAgJ0InOiBbMjAwLCAzMDBdLAogICAgICAgICdDJzogWzQwMCwgNTAwXQogICAgfQp9CgpvYmoyID0gewogICAgJzEwMCc6IHsKICAgICAgICAnQSc6IFsnWlpaJywgJ1lZWScsICdYWFgnXSwKICAgICAgICAnQic6IFtdLAogICAgICAgICdDJzogW10sCiAgICB9LAogICAgJzIwMCc6IHsKICAgICAgICAnQSc6IFsnWlpaJ10sCiAgICAgICAgJ0InOiBbJ1lZWScsICdYWFgnXSwKICAgICAgICAnQyc6IFtdLAogICAgfSwKICAgICczMDAnOiB7CiAgICAgICAgJ0EnOiBbJ1paWiddLAogICAgICAgICdCJzogWydZWVknLCAnWFhYJ10sCiAgICAgICAgJ0MnOiBbXSwKICAgIH0sCiAgICAnNDAwJzogewogICAgICAgICdBJzogW10sCiAgICAgICAgJ0InOiBbJ1paWicsICdZWVknXSwKICAgICAgICAnQyc6IFsnWFhYJ10sCiAgICB9LAogICAgJzUwMCc6IHsKICAgICAgICAnQSc6IFtdLAogICAgICAgICdCJzogW10sCiAgICAgICAgJ0MnOiBbJ1paWicsICdZWVknLCAnWFhYJ10sCiAgICB9LAp9CgpyZXN1bHQgPSB7fQpsZXR0ZXJzX2NhY2hlID0gc2V0KCkKIyBpdGVyYXRlIG92ZXIgZmlyc3QgbGF5ZXIgKFhYWCwgWVlZLCBaWlopCmZvciBncm91cCwgbGV0dGVycyBpbiBvYmoxLml0ZXJpdGVtcygpOgogICAgIyBpdGVyYXRlIG92ZXIgc2Vjb25kIGxheWVyIChBLCBCLCBDKQogICAgZm9yIGxldHRlciwgbnVtYmVycyBpbiBsZXR0ZXJzLml0ZXJpdGVtcygpOgogICAgICAgICMgaXRlcmF0ZSBvdmVyIG51bWJlcnMKICAgICAgICBsZXR0ZXJzX2NhY2hlLmFkZChsZXR0ZXIpCiAgICAgICAgZm9yIG51bSBpbiBudW1iZXJzOgogICAgICAgICAgICBzdHJfbnVtID0gc3RyKG51bSkKICAgICAgICAgICAgIyBzZXQgdXAgbnVtYmVyIGFzIHRvcCBsZXZlbCBrZXkKICAgICAgICAgICAgcmVzdWx0W3N0cl9udW1dID0gcmVzdWx0LmdldChzdHJfbnVtLCB7fSkKICAgICAgICAgICAgIyBzZXQgdXAgbGV0dGVyIGFzIHNlY29uZCBsZXZlbCBrZXkKICAgICAgICAgICAgcmVzdWx0W3N0cl9udW1dW2xldHRlcl0gPSByZXN1bHRbc3RyX251bV0uZ2V0KGxldHRlciwgW10pCiAgICAgICAgICAgICMgc2V0IGFwcGVuZCBncm91cCBuYW1lCiAgICAgICAgICAgIHJlc3VsdFtzdHJfbnVtXVtsZXR0ZXJdLmFwcGVuZChncm91cCkKCiMgYXBwZW5kIG1pc3NlZCBsZXR0ZXIgdG8gcmVzdWx0CmZvciBudW1iZXIsIGxldHRlcl9ncm91cCBpbiByZXN1bHQuaXRlcml0ZW1zKCk6CiAgICBmb3IgbGV0dGVyIGluIGxldHRlcnNfY2FjaGU6CiAgICAgICAgaWYgbGV0dGVyIG5vdCBpbiBsZXR0ZXJfZ3JvdXA6CiAgICAgICAgICAgIGxldHRlcl9ncm91cFtsZXR0ZXJdID0gW10KCnByaW50KHJlc3VsdCk=