重新组织嵌套的 `dict`

huangapple go评论100阅读模式
英文:

Reorganize nested `dict`

问题

这个问题与此处相关。我想要重新组织以下嵌套的dict

  1. a = {
  2. (0.0, 0.0): {'a': [25, 29, nan]},
  3. (0.0, 2.0): {'a': [25, 29, nan], 'b': [25, 35, 31.0]},
  4. (0.0, 4.0): {'b': [25, 35, 31.0]},
  5. (2.0, 0.0): {'a': [25, 29, nan], 'c': [25, 26, 29.0]},
  6. (2.0, 1.5): {'a': [25, 29, nan], 'c': [25, 26, 29.0]},
  7. (2.0, 2.0): {'a': [25, 29, nan], 'b': [25, 35, 31.0]},
  8. (2.0, 4.0): {'b': [25, 35, 31.0]},
  9. (3.0, 3.0): {'d': [25, 31, 32.0]},
  10. (3.0, 5.0): {'d': [25, 31, 32.0]},
  11. (5.0, 0.0): {'c': [25, 26, 29.0]},
  12. (5.0, 1.5): {'c': [25, 26, 29.0]},
  13. (5.0, 3.0): {'d': [25, 31, 32.0]},
  14. (5.0, 5.0): {'d': [25, 31, 32.0]},
  15. (6.0, 1.0): {'e': [25, 28, 30.0]},
  16. (6.0, 3.0): {'e': [25, 28, 30.0]},
  17. (8.0, 1.0): {'e': [25, 28, 30.0]},
  18. (8.0, 3.0): {'e': [25, 28, 30.0]}
  19. }

我想要交换内部和外部的key。一些外部的key会重复,value 应该变成一个listlists。结果应该是:

  1. {'a': {(0.0, 0.0): [[25, 29, nan]],
  2. (0.0, 2.0): [[25, 29, nan], [25, 35, 31.0]],
  3. (2.0, 0.0): [[25, 29, nan], [25, 26, 29.0]],
  4. (2.0, 1.5): [[25, 29, nan], [25, 26, 29.0]],
  5. (2.0, 2.0): [[25, 29, nan], [25, 35, 31.0]]},
  6. 'b': {(0.0, 2.0): [[25, 29, nan], [25, 35, 31.0]],
  7. (0.0, 4.0): [[25, 35, 31.0]],
  8. (2.0, 2.0): [[25, 29, nan], [25, 35, 31.0]],
  9. (2.0, 4.0): [[25, 35, 31.0]]},
  10. 'c': {(2.0, 0.0): [[25, 29, nan], [25, 26, 29.0]],
  11. (2.0, 1.5): [[25, 29, nan], [25, 26, 29.0]],
  12. (5.0, 0.0): [[25, 26, 29.0]],
  13. (5.0, 1.5): [[25, 26, 29.0]]},
  14. 'd': {(3.0, 3.0): [[25, 31, 32.0]],
  15. (3.0, 5.0): [[25, 31, 32.0]],
  16. (5.0, 3.0): [[25, 31, 32.0]],
  17. (5.0, 5.0): [[25, 31, 32.0]]},
  18. 'e': {(6.0, 1.0): [[25, 28, 30.0]],
  19. (6.0, 3.0): [[25, 28, 30.0]],
  20. (8.0, 1.0): [[25, 28, 30.0]],
  21. (8.0, 3.0): [[25, 28, 30.0]]}
  22. }

直觉告诉我使用pd.DataFrame.groupby() [并剔除NaN单元格] 是正确的方法...

  1. df = pd.DataFrame(dict_vertices)
  2. print(df.head(2))
  3. 0.0 2.0 ... 8.0 6.0
  4. 0.0 0.0 1.5 ... 1.0 3.0 3.0
  5. a [25, 29, nan] [25, 29, nan] [25, 29, nan] ... NaN NaN NaN
  6. c NaN [[25, 26, 29.0]] [[25, 26, 29.0]] ... NaN NaN NaN
  7. [2 rows x 17 columns]

...但我不确定。如何重新组织以下嵌套的dict,其中value跟随外部的key

英文:

This question is connected to [-> here].
I would like to reorganize the following nested dict please:

  1. a = {
  2. (0.0, 0.0): {'a': [25, 29, nan]},
  3. (0.0, 2.0): {'a': [25, 29, nan], 'b': [25, 35, 31.0]},
  4. (0.0, 4.0): {'b': [25, 35, 31.0]},
  5. (2.0, 0.0): {'a': [25, 29, nan], 'c': [25, 26, 29.0]},
  6. (2.0, 1.5): {'a': [25, 29, nan], 'c': [25, 26, 29.0]},
  7. (2.0, 2.0): {'a': [25, 29, nan], 'b': [25, 35, 31.0]},
  8. (2.0, 4.0): {'b': [25, 35, 31.0]},
  9. (3.0, 3.0): {'d': [25, 31, 32.0]},
  10. (3.0, 5.0): {'d': [25, 31, 32.0]},
  11. (5.0, 0.0): {'c': [25, 26, 29.0]},
  12. (5.0, 1.5): {'c': [25, 26, 29.0]},
  13. (5.0, 3.0): {'d': [25, 31, 32.0]},
  14. (5.0, 5.0): {'d': [25, 31, 32.0]},
  15. (6.0, 1.0): {'e': [25, 28, 30.0]},
  16. (6.0, 3.0): {'e': [25, 28, 30.0]},
  17. (8.0, 1.0): {'e': [25, 28, 30.0]},
  18. (8.0, 3.0): {'e': [25, 28, 30.0]}
  19. }

I want to swap the inner and outer keys.
Some outer keys will duplicate and the value should become a list of lists. The result should be:

  1. {'a': {(0.0, 0.0): [[25, 29, nan]],
  2. (0.0, 2.0): [[25, 29, nan], [25, 35, 31.0]],
  3. (2.0, 0.0): [[25, 29, nan], [25, 26, 29.0]],
  4. (2.0, 1.5): [[25, 29, nan], [25, 26, 29.0]],
  5. (2.0, 2.0): [[25, 29, nan], [25, 35, 31.0]]},
  6. 'b': {(0.0, 2.0): [[25, 29, nan], [25, 35, 31.0]],
  7. (0.0, 4.0): [[25, 35, 31.0]],
  8. (2.0, 2.0): [[25, 29, nan], [25, 35, 31.0]],
  9. (2.0, 4.0): [[25, 35, 31.0]]},
  10. 'c': {(2.0, 0.0): [[25, 29, nan], [25, 26, 29.0]],
  11. (2.0, 1.5): [[25, 29, nan], [25, 26, 29.0]],
  12. (5.0, 0.0): [[25, 26, 29.0]],
  13. (5.0, 1.5): [[25, 26, 29.0]]},
  14. 'd': {(3.0, 3.0): [[25, 31, 32.0]],
  15. (3.0, 5.0): [[25, 31, 32.0]],
  16. (5.0, 3.0): [[25, 31, 32.0]],
  17. (5.0, 5.0): [[25, 31, 32.0]]},
  18. 'e': {(6.0, 1.0): [[25, 28, 30.0]],
  19. (6.0, 3.0): [[25, 28, 30.0]],
  20. (8.0, 1.0): [[25, 28, 30.0]],
  21. (8.0, 3.0): [[25, 28, 30.0]]}
  22. }

Intuition tells me pd.DataFrame with a .groupby() [and cull the NaN cells] would be the way to go...

  1. df = pd.DataFrame(dict_vertices)
  2. print(df.head(2))
  3. 0.0 2.0 ... 8.0 6.0
  4. 0.0 0.0 1.5 ... 1.0 3.0 3.0
  5. a [25, 29, nan] [25, 29, nan] [25, 29, nan] ... NaN NaN NaN
  6. c NaN [[25, 26, 29.0]] [[25, 26, 29.0]] ... NaN NaN NaN
  7. [2 rows x 17 columns]

...but I don't know.
How do I reorganize the following nested dict please; where the value follows the outer key?

答案1

得分: 1

你可以使用以下代码:

  1. out = {}
  2. for k1, d in a.items():
  3. for k2 in d:
  4. out.setdefault(k2, {})[k1] = list(d.values())

输出如下:

  1. {
  2. 'a': {
  3. (0.0, 0.0): [[25, 29, nan]],
  4. (0.0, 2.0): [[25, 29, nan], [[25, 35, 31.0]]],
  5. (2.0, 0.0): [[25, 29, nan], [[25, 26, 29.0]]],
  6. (2.0, 1.5): [[25, 29, nan], [[25, 26, 29.0]]],
  7. (2.0, 2.0): [[25, 29, nan], [[25, 35, 31.0]]]
  8. },
  9. 'b': {
  10. (0.0, 2.0): [[25, 29, nan], [[25, 35, 31.0]]],
  11. (0.0, 4.0): [[25, 35, 31.0]],
  12. (2.0, 2.0): [[25, 29, nan], [[25, 35, 31.0]]],
  13. (2.0, 4.0): [[25, 35, 31.0]]
  14. },
  15. 'c': {
  16. (2.0, 0.0): [[25, 29, nan], [[25, 26, 29.0]]],
  17. (2.0, 1.5): [[25, 29, nan], [[25, 26, 29.0]]],
  18. (5.0, 0.0): [[25, 26, 29.0]],
  19. (5.0, 1.5): [[25, 26, 29.0]]
  20. },
  21. 'd': {
  22. (3.0, 3.0): [[25, 31, 32.0]],
  23. (3.0, 5.0): [[25, 31, 32.0]],
  24. (5.0, 3.0): [[25, 31, 32.0]],
  25. (5.0, 5.0): [[25, 31, 32.0]]
  26. },
  27. 'e': {
  28. (6.0, 1.0): [[25, 28, 30.0]],
  29. (6.0, 3.0): [[25, 28, 30.0]],
  30. (8.0, 1.0): [[25, 28, 30.0]],
  31. (8.0, 3.0): [[25, 28, 30.0]]
  32. }
  33. }
英文:

You can use:

  1. out = {}
  2. for k1, d in a.items():
  3. for k2 in d:
  4. out.setdefault(k2, {})[k1] = list(d.values())

Output:

  1. {'a': {(0.0, 0.0): [[25, 29, nan]],
  2. (0.0, 2.0): [[25, 29, nan], [[25, 35, 31.0]]],
  3. (2.0, 0.0): [[25, 29, nan], [[25, 26, 29.0]]],
  4. (2.0, 1.5): [[25, 29, nan], [[25, 26, 29.0]]],
  5. (2.0, 2.0): [[25, 29, nan], [[25, 35, 31.0]]]},
  6. 'b': {(0.0, 2.0): [[25, 29, nan], [[25, 35, 31.0]]],
  7. (0.0, 4.0): [[25, 35, 31.0]],
  8. (2.0, 2.0): [[25, 29, nan], [[25, 35, 31.0]]],
  9. (2.0, 4.0): [[25, 35, 31.0]]},
  10. 'c': {(2.0, 0.0): [[25, 29, nan], [[25, 26, 29.0]]],
  11. (2.0, 1.5): [[25, 29, nan], [[25, 26, 29.0]]],
  12. (5.0, 0.0): [[25, 26, 29.0]],
  13. (5.0, 1.5): [[25, 26, 29.0]]},
  14. 'd': {(3.0, 3.0): [[25, 31, 32.0]],
  15. (3.0, 5.0): [[25, 31, 32.0]],
  16. (5.0, 3.0): [[25, 31, 32.0]],
  17. (5.0, 5.0): [[25, 31, 32.0]]},
  18. 'e': {(6.0, 1.0): [[25, 28, 30.0]],
  19. (6.0, 3.0): [[25, 28, 30.0]],
  20. (8.0, 1.0): [[25, 28, 30.0]],
  21. (8.0, 3.0): [[25, 28, 30.0]]},
  22. }

huangapple
  • 本文由 发表于 2023年6月2日 00:21:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/76383903.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定