fork download
  1. obj1 = {
  2. 'ZZZ': {
  3. 'A': [100, 200, 300],
  4. 'B': [400],
  5. 'C': [500]
  6. },
  7. 'YYY': {
  8. 'A': [100],
  9. 'B': [200, 300, 400],
  10. 'C': [500]
  11. },
  12. 'XXX': {
  13. 'A': [100],
  14. 'B': [200, 300],
  15. 'C': [400, 500]
  16. }
  17. }
  18.  
  19. obj2 = {
  20. '100': {
  21. 'A': ['ZZZ', 'YYY', 'XXX'],
  22. 'B': [],
  23. 'C': [],
  24. },
  25. '200': {
  26. 'A': ['ZZZ'],
  27. 'B': ['YYY', 'XXX'],
  28. 'C': [],
  29. },
  30. '300': {
  31. 'A': ['ZZZ'],
  32. 'B': ['YYY', 'XXX'],
  33. 'C': [],
  34. },
  35. '400': {
  36. 'A': [],
  37. 'B': ['ZZZ', 'YYY'],
  38. 'C': ['XXX'],
  39. },
  40. '500': {
  41. 'A': [],
  42. 'B': [],
  43. 'C': ['ZZZ', 'YYY', 'XXX'],
  44. },
  45. }
  46.  
  47. result = {}
  48. letters_cache = set()
  49. # iterate over first layer (XXX, YYY, ZZZ)
  50. for group, letters in obj1.iteritems():
  51. # iterate over second layer (A, B, C)
  52. for letter, numbers in letters.iteritems():
  53. # iterate over numbers
  54. letters_cache.add(letter)
  55. for num in numbers:
  56. str_num = str(num)
  57. # set up number as top level key
  58. result[str_num] = result.get(str_num, {})
  59. # set up letter as second level key
  60. result[str_num][letter] = result[str_num].get(letter, [])
  61. # set append group name
  62. result[str_num][letter].append(group)
  63.  
  64. # append missed letter to result
  65. for number, letter_group in result.iteritems():
  66. for letter in letters_cache:
  67. if letter not in letter_group:
  68. letter_group[letter] = []
  69.  
  70. print(result)
Success #stdin #stdout 0.01s 118784KB
stdin
Standard input is empty
stdout
{'100': {'A': ['ZZZ', 'YYY', 'XXX'], 'B': [], 'C': []}, '200': {'A': ['ZZZ'], 'B': ['YYY', 'XXX'], 'C': []}, '300': {'A': ['ZZZ'], 'B': ['YYY', 'XXX'], 'C': []}, '400': {'B': ['ZZZ', 'YYY'], 'C': ['XXX'], 'A': []}, '500': {'C': ['ZZZ', 'YYY', 'XXX'], 'A': [], 'B': []}}