以下是一个示例代码,演示如何将对象按键进行分组并创建一个树结构:
from collections import defaultdict
class TreeNode:
def __init__(self, key):
self.key = key
self.children = []
def group_objects(objects, key_func):
tree = TreeNode(None)
groups = defaultdict(list)
for obj in objects:
key = key_func(obj)
groups[key].append(obj)
for key, objs in groups.items():
subtree = TreeNode(key)
tree.children.append(subtree)
for obj in objs:
child = TreeNode(obj)
subtree.children.append(child)
return tree
这个示例代码中,首先定义了一个TreeNode
类,表示树的节点。每个节点有一个key
属性,表示节点的键,以及一个children
属性,表示节点的子节点列表。
然后,定义了一个group_objects
函数,接受一个对象列表objects
和一个键函数key_func
作为参数。该函数使用defaultdict
创建一个空字典groups
,用于存储按键分组的结果。
接下来,遍历objects
列表中的每个对象,使用key_func
函数计算对象的键,并将对象添加到对应键的分组中。
然后,遍历groups
字典中的每个键值对,创建一个新的子树节点,并将其添加到根节点的子节点列表中。然后,遍历对应键的分组中的每个对象,创建一个新的叶子节点,并将其添加到子树节点的子节点列表中。
最后,返回创建的根节点,即可得到按键分组并创建的树结构。
以下是一个示例的使用方法:
# 示例对象列表
objects = [
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 30},
{'name': 'Charlie', 'age': 25},
{'name': 'Dave', 'age': 30}
]
# 键函数,将对象按照年龄进行分组
def key_func(obj):
return obj['age']
# 按键分组并创建树
tree = group_objects(objects, key_func)
# 输出树的结构
def print_tree(node, indent=0):
print(' ' * indent + str(node.key))
for child in node.children:
print_tree(child, indent+1)
print_tree(tree)
以上示例代码将对象按照年龄进行分组,并创建了一个树结构。输出结果如下:
None
25
{'name': 'Alice', 'age': 25}
{'name': 'Charlie', 'age': 25}
30
{'name': 'Bob', 'age': 30}
{'name': 'Dave', 'age': 30}
可以看到,树的根节点为None
,有两个子节点,分别是年龄为25和30的分组。每个分组又包含了对应的对象作为叶子节点。
上一篇:按键将对象分组并返回新对象
下一篇:按键将JSON对象转换为数组。