Guest User

Untitled

a guest
Nov 21st, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. [
  2. (None, 'Child 2', 'data1'),
  3. ('Child 1', 'Child 1.1', 'data2'),
  4. (None, 'Child 1', '')
  5. ]
  6.  
  7. [
  8. {
  9. 'children': [],
  10. 'data': ['data1'],
  11. 'name': 'Child 2'
  12. },
  13. {
  14. 'children': [
  15. {
  16. 'children': [],
  17. 'data': ['data2'],
  18. 'name': 'Child 1.1'
  19. }
  20. ],
  21. 'data': [''],
  22. 'name': 'Child 1'
  23. }
  24. ]
  25.  
  26. def create_tree(pairs):
  27. def node(): return [ROOT, [], []]
  28. table = defaultdict(node)
  29. # Build 2-way mapping between nodes
  30. for parent, child, data in pairs:
  31. table[parent][1].append(child) # parent - > children
  32. table[child][0] = parent # child -> parent
  33. table[parent][2].append(data)
  34.  
  35. def follow(parent, childids):
  36. for content in childids:
  37. for name in content['items']:
  38. empty = []
  39. child = {
  40. 'name': name,
  41. 'children': empty,
  42. 'data': content['data']
  43. }
  44. parent.append(child)
  45. if name in table:
  46. this_dict = [{
  47. 'items': table[name][1],
  48. 'data': table[name][2]
  49. }]
  50. follow(empty, this_dict)
  51. # Recursively fill in the tree
  52. tree = {ROOT: []}
  53. roots = [{'item': k, 'data': v[2]} for k, v in table.items() if v[0] == ROOT]
  54. my_root_items = [{
  55. 'items': map(lambda s: s['item'], roots),
  56. 'data': map(lambda s: s['data'], roots),
  57. }]
  58. follow(tree[ROOT], my_root_items)
  59. return tree[ROOT]
Add Comment
Please, Sign In to add comment