使用Python转换具有“level”列的数据。

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

Transform data with level column in python

问题

这是您所提供的数据,表示分层树结构:

  1. [
  2. {
  3. "level": 0,
  4. "name": "python"
  5. },
  6. {
  7. "level": 1,
  8. "name": "food"
  9. },
  10. {
  11. "level": 2,
  12. "name": "banana"
  13. },
  14. {
  15. "level": 3,
  16. "name": "protein"
  17. },
  18. {
  19. "level": 2,
  20. "name": "apple"
  21. },
  22. {
  23. "level": 1,
  24. "name": "fuel"
  25. }
  26. ]

我想要将其转换为以下结构:

  1. [
  2. {
  3. "level": 0,
  4. "name": "python",
  5. "children": [
  6. {
  7. "level": 1,
  8. "name": "food",
  9. "children": [
  10. {
  11. "level": 2,
  12. "name": "banana",
  13. "children": [
  14. {
  15. "level": 3,
  16. "name": "protein",
  17. "children": [
  18. ]
  19. }
  20. ]
  21. },
  22. {
  23. "level": 2,
  24. "name": "apple",
  25. "children": [
  26. ]
  27. }
  28. ]
  29. },
  30. {
  31. "level": 1,
  32. "name": "fuel",
  33. "children": [
  34. ]
  35. }
  36. ]
  37. }
  38. ]

我使用Python,希望在Python中提供解决方案,无论是否使用外部库(包括pandas)。期待您的解决方案,提前感谢!

英文:

I have data like this which represents hierarchical tree structure:

  1. [
  2. {
  3. "level":0,
  4. "name":"python"
  5. },
  6. {
  7. "level":1,
  8. "name":"food"
  9. },
  10. {
  11. "level":2,
  12. "name":"banana"
  13. },
  14. {
  15. "level":3,
  16. "name":"protein"
  17. },
  18. {
  19. "level":2,
  20. "name":"apple"
  21. },
  22. {
  23. "level":1,
  24. "name":"fuel"
  25. }
  26. ]

I want to transform it into:

  1. [
  2. {
  3. "level":0,
  4. "name":"python",
  5. "children":[
  6. {
  7. "level":1,
  8. "name":"food",
  9. "children":[
  10. {
  11. "level":2,
  12. "name":"banana",
  13. "children":[
  14. {
  15. "level":3,
  16. "name":"protein",
  17. "children":[
  18. ]
  19. }
  20. ]
  21. },
  22. {
  23. "level":2,
  24. "name":"apple",
  25. "children":[
  26. ]
  27. }
  28. ]
  29. },
  30. {
  31. "level":1,
  32. "name":"fuel",
  33. "children":[
  34. ]
  35. }
  36. ]
  37. }
  38. ]

I am using python and would prefer the solution in python with or without using external libraries, (even using pandas). I would love to see the solutions, thank you in advance 使用Python转换具有“level”列的数据。

答案1

得分: 1

以下是代码部分的中文翻译:

  1. def create_tree(nodes):
  2. # 为每个节点添加父节点信息
  3. for i, node in enumerate(nodes):
  4. if node['level'] == 0:
  5. node['parent'] = None
  6. else:
  7. j = i - 1
  8. while j >= 0:
  9. if nodes[j]['level'] < node['level']:
  10. node['parent'] = nodes[j]['name']
  11. break
  12. j -= 1
  13. node_dict = {}
  14. for node in nodes:
  15. node_dict[node['name']] = node
  16. for node in nodes:
  17. parent_name = node.get('parent')
  18. if parent_name is not None:
  19. parent = node_dict[parent_name]
  20. if 'children' not in parent:
  21. parent['children'] = []
  22. parent['children'].append(node)
  23. for node in nodes:
  24. if node.get('parent') is None:
  25. return node
  26. return None
  27. nodes = [
  28. {"level": 0, "name": "python"},
  29. {"level": 1, "name": "food"},
  30. {"level": 2, "name": "banana"},
  31. {"level": 3, "name": "protein"},
  32. {"level": 2, "name": "apple"},
  33. {"level": 1, "name": "fuel"}
  34. ]
  35. tree = create_tree(nodes)
  36. print(tree)

这是你所需的代码。

英文:

Here is one way:

  1. def create_tree(nodes):
  2. # add parent information to each node
  3. for i, node in enumerate(nodes):
  4. if node[&#39;level&#39;] == 0:
  5. node[&#39;parent&#39;] = None
  6. else:
  7. j = i - 1
  8. while j &gt;= 0:
  9. if nodes[j][&#39;level&#39;] &lt; node[&#39;level&#39;]:
  10. node[&#39;parent&#39;] = nodes[j][&#39;name&#39;]
  11. break
  12. j -= 1
  13. node_dict = {}
  14. for node in nodes:
  15. node_dict[node[&#39;name&#39;]] = node
  16. for node in nodes:
  17. parent_name = node.get(&#39;parent&#39;)
  18. if parent_name is not None:
  19. parent = node_dict[parent_name]
  20. if &#39;children&#39; not in parent:
  21. parent[&#39;children&#39;] = []
  22. parent[&#39;children&#39;].append(node)
  23. for node in nodes:
  24. if node.get(&#39;parent&#39;) is None:
  25. return node
  26. return None
  27. nodes = [
  28. {&quot;level&quot;:0,&quot;name&quot;:&quot;python&quot;},
  29. {&quot;level&quot;:1,&quot;name&quot;:&quot;food&quot;},
  30. {&quot;level&quot;:2,&quot;name&quot;:&quot;banana&quot;},
  31. {&quot;level&quot;:3,&quot;name&quot;:&quot;protein&quot;},
  32. {&quot;level&quot;:2,&quot;name&quot;:&quot;apple&quot;},
  33. {&quot;level&quot;:1,&quot;name&quot;:&quot;fuel&quot;}
  34. ]
  35. tree = create_tree(nodes)
  36. print(tree)

which gives what you wanted

  1. {&#39;level&#39;: 0, &#39;name&#39;: &#39;python&#39;, &#39;parent&#39;: None, &#39;children&#39;: [{&#39;level&#39;: 1, &#39;name&#39;: &#39;food&#39;, &#39;parent&#39;: &#39;python&#39;, &#39;children&#39;: [{&#39;level&#39;: 2, &#39;name&#39;: &#39;banana&#39;, &#39;parent&#39;: &#39;food&#39;, &#39;children&#39;: [{&#39;level&#39;: 3, &#39;name&#39;: &#39;protein&#39;, &#39;parent&#39;: &#39;banana&#39;}]}, {&#39;level&#39;: 2, &#39;name&#39;: &#39;apple&#39;, &#39;parent&#39;: &#39;food&#39;}]}, {&#39;level&#39;: 1, &#39;name&#39;: &#39;fuel&#39;, &#39;parent&#39;: &#39;python&#39;}]}

答案2

得分: 1

以下是代码部分的翻译:

  1. 我想你的列表中字典的顺序很重要否则我将不知道子元素应该在哪个父元素下列出我建议编写一个递归函数以获取在第 n 级的最后一个元素并将子元素附加在那里
  2. input_list = [
  3. {
  4. "level": 0,
  5. "name": "python"
  6. },
  7. {
  8. "level": 1,
  9. "name": "food"
  10. },
  11. {
  12. "level": 2,
  13. "name": "banana"
  14. },
  15. {
  16. "level": 3,
  17. "name": "protein"
  18. },
  19. {
  20. "level": 2,
  21. "name": "apple"
  22. },
  23. {
  24. "level": 1,
  25. "name": "fuel"
  26. }
  27. ]
  28. def get_last_elt_at_lvl(rec, lvl):
  29. if lvl == 0:
  30. return rec[-1]
  31. else:
  32. for i in range(len(rec)-1,-1,-1):
  33. if rec[i]['children']:
  34. r = get_last_elt_at_lvl(rec[-1]['children'], lvl-1)
  35. if r:
  36. return r
  37. return None
  38. output_list = []
  39. for d in input_list:
  40. if d["level"] == 0:
  41. output_list.append(d)
  42. else:
  43. last_elt = get_last_elt_at_lvl(output_list, d["level"]-1)
  44. children = last_elt.setdefault('children', [])
  45. children.append(d)
  46. print(json.dumps(output_list, indent=4))

输出结果:

  1. [
  2. {
  3. "level": 0,
  4. "name": "python",
  5. "children": [
  6. {
  7. "level": 1,
  8. "name": "food",
  9. "children": [
  10. {
  11. "level": 2,
  12. "name": "banana",
  13. "children": [
  14. {
  15. "level": 3,
  16. "name": "protein"
  17. }
  18. ]
  19. },
  20. {
  21. "level": 2,
  22. "name": "apple"
  23. }
  24. ]
  25. },
  26. {
  27. "level": 1,
  28. "name": "fuel"
  29. }
  30. ]
  31. }
  32. ]

希望这对你有所帮助!

英文:

I suppose the order of the dictionaries in your list matters, since otherwise I wouldn't know under which parent the children are supposed to be listed. I would suggest to write a recursive function to get the last element at level n and append the children there:

  1. import json
  2. input_list = [
  3. {
  4. &quot;level&quot;:0,
  5. &quot;name&quot;:&quot;python&quot;
  6. },
  7. {
  8. &quot;level&quot;:1,
  9. &quot;name&quot;:&quot;food&quot;
  10. },
  11. {
  12. &quot;level&quot;:2,
  13. &quot;name&quot;:&quot;banana&quot;
  14. },
  15. {
  16. &quot;level&quot;:3,
  17. &quot;name&quot;:&quot;protein&quot;
  18. },
  19. {
  20. &quot;level&quot;:2,
  21. &quot;name&quot;:&quot;apple&quot;
  22. },
  23. {
  24. &quot;level&quot;:1,
  25. &quot;name&quot;:&quot;fuel&quot;
  26. }
  27. ]
  28. def get_last_elt_at_lvl(rec, lvl):
  29. if lvl == 0:
  30. return rec[-1]
  31. else:
  32. for i in range(len(rec)-1,-1,-1):
  33. if rec[i][&#39;children&#39;]:
  34. r = get_last_elt_at_lvl(rec[-1][&#39;children&#39;], lvl-1)
  35. if r:
  36. return r
  37. return None
  38. output_list = []
  39. for d in input_list:
  40. if d[&quot;level&quot;] == 0:
  41. output_list.append(d)
  42. else:
  43. last_elt = get_last_elt_at_lvl(output_list, d[&quot;level&quot;]-1)
  44. children = last_elt.setdefault(&#39;children&#39;, [])
  45. children.append(d)
  46. print(json.dumps(output_list, indent=4))

Output:

  1. [
  2. {
  3. &quot;level&quot;: 0,
  4. &quot;name&quot;: &quot;python&quot;,
  5. &quot;children&quot;: [
  6. {
  7. &quot;level&quot;: 1,
  8. &quot;name&quot;: &quot;food&quot;,
  9. &quot;children&quot;: [
  10. {
  11. &quot;level&quot;: 2,
  12. &quot;name&quot;: &quot;banana&quot;,
  13. &quot;children&quot;: [
  14. {
  15. &quot;level&quot;: 3,
  16. &quot;name&quot;: &quot;protein&quot;
  17. }
  18. ]
  19. },
  20. {
  21. &quot;level&quot;: 2,
  22. &quot;name&quot;: &quot;apple&quot;
  23. }
  24. ]
  25. },
  26. {
  27. &quot;level&quot;: 1,
  28. &quot;name&quot;: &quot;fuel&quot;
  29. }
  30. ]
  31. }
  32. ]

huangapple
  • 本文由 发表于 2023年2月23日 23:53:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/75547223.html
匿名

发表评论

匿名网友

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

确定