python 递归

1)递归将列表转化成树

2)递归获取选中节点树

# 城市列表
data = [
    {"id":1,"name":"浙江","upperid":None},
    {"id":2,"name":"江苏","upperid":None},
    {"id":3,"name":"福建","upperid":None},
    {"id":11,"name":"杭州","upperid":1},
    {"id":12,"name":"嘉兴","upperid":1},
    {"id":21,"name":"苏州","upperid":2},
    {"id":22,"name":"无锡","upperid":2},
    {"id":31,"name":"福州","upperid":3},
    {"id":32,"name":"厦门","upperid":3},
    {"id":111,"name":"萧山","upperid":11},
    {"id":112,"name":"临安","upperid":11},
    {"id":121,"name":"嘉善","upperid":12},
    {"id":122,"name":"桐乡","upperid":12},
    {"id":211,"name":"吴江","upperid":21},
    {"id":212,"name":"常熟","upperid":21}
]

 
# 根据城市列表,递归获取城市树
def get_tree(data):
    tree_data=[]
    for node in [node for node in data if node['upperid'] == None]:
        node['path']=[]
        node['path'].append(node['id'])
        node['children']=[]
        tree_data.append(node)
        get_children(node,data)
    return tree_data
 
def get_children(upper_node,data):
    res = [node for node in data if node['upperid'] == upper_node['id']]
    if len(res)>0:
        for node in res:
            node['path']=[]
            node['path'].extend(upper_node['path'])
            node['path'].append(node['id'])
            node['children']=[]
            upper_node['children'].append(node)
            get_children(node,data)

# 获取选中节点树(包括父节点)
def get_selected_tree(tree,ids):
    new_tree=[]
    for root_node in tree:
        is_keep=is_node_keep(root_node,ids)
        if is_keep==True:
            new_tree.append(root_node)
    return new_tree

def is_node_keep(node,ids):
    is_keep=False
    if node['id'] in ids:
        is_keep=True
    if len(node['children']):
        new_children=[]
        for child_node in node['children']:
            is_child_keep=is_node_keep(child_node,ids)
            if is_child_keep==True:
                new_children.append(child_node)
        if len(new_children)>0:
            is_keep=True
        node['children']=new_children
    return is_keep

# 调用递归方法
print('城市树结构')
tree=get_tree(data)
print(tree)
print('选中城市(杭州、嘉善、吴江)')
ids=[11, 121, 211]
new_tree=get_selected_tree(tree,ids)
print(new_tree)

全树json效果

[{
	"id": 1,
	"name": "浙江",
	"upperid": "",
	"path": [1],
	"children": [{
		"id": 11,
		"name": "杭州",
		"upperid": 1,
		"path": [1, 11],
		"children": [{
			"id": 111,
			"name": "萧山",
			"upperid": 11,
			"path": [1, 11, 111],
			"children": []
		}, {
			"id": 112,
			"name": "临安",
			"upperid": 11,
			"path": [1, 11, 112],
			"children": []
		}]
	}, {
		"id": 12,
		"name": "嘉兴",
		"upperid": 1,
		"path": [1, 12],
		"children": [{
			"id": 121,
			"name": "嘉善",
			"upperid": 12,
			"path": [1, 12, 121],
			"children": []
		}, {
			"id": 122,
			"name": "桐乡",
			"upperid": 12,
			"path": [1, 12,
				122
			],
			"children": []
		}]
	}]
}, {
	"id": 2,
	"name": "江苏",
	"upperid": "",
	"path": [2],
	"children": [{
		"id": 21,
		"name": "苏州",
		"upperid": 2,
		"path": [2, 21],
		"children": [{
			"id": 211,
			"name": "吴江",
			"upperid": 21,
			"path": [2, 21, 211],
			"children": []
		}, {
			"id": 212,
			"name": "常熟",
			"upperid": 21,
			"path": [2, 21, 212],
			"children": []
		}]
	}, {
		"id": 22,
		"name": "无锡",
		"upperid": 2,
		"path": [2, 22],
		"children": []
	}]
}, {
	"id": 3,
	"name": "福建",
	"upperid": "",
	"path": [3],
	"children": [{
		"id": 31,
		"name": "福州",
		"upperid": 3,
		"path": [3, 31],
		"children": []
	}, {
		"id": 32,
		"name": "厦门",
		"upperid": 3,
		"path": [3, 32],
		"children": []
	}]
}]

获取选中节点树(包括父节点)

[{
	"id": 1,
	"name": "浙江",
	"upperid": "",
	"path": [1],
	"children": [{
		"id": 11,
		"name": "杭州",
		"upperid": 1,
		"path": [1, 11],
		"children": []
	}, {
		"id": 12,
		"name": "嘉兴",
		"upperid": 1,
		"path": [1, 12],
		"children": [{
			"id": 121,
			"name": "嘉善",
			"upperid": 12,
			"path": [1, 12, 121],
			"children": []
		}]
	}]
}, {
	"id": 2,
	"name": "江苏",
	"upperid": "",
	"path": [2],
	"children": [{
		"id": 21,
		"name": "苏州",
		"upperid": 2,
		"path": [2, 21],
		"children": [{
			"id": 211,
			"name": "吴江",
			"upperid": 21,
			"path": [2, 21, 211],
			"children": []
		}]
	}]
}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值