Python递归filter_orgs函数及海象运算符列表推导逻辑解析
组织机构树递归过滤代码逻辑详解
这段代码的核心作用是过滤多层嵌套的组织机构数据,自动剪掉所有「自身不可用、且所有后代也没有可用节点」的无效分支,只保留有效节点构成的树结构。
核心代码逐段拆解
1. 带海象运算符的列表推导式
你困惑的这行代码是整个递归过滤的核心:
orgs = [org for o in source["orgs"] if (org := filter_orgs(o))]
逻辑拆解:
- 基础逻辑是遍历当前节点下的所有直接子组织
o,逐个做递归处理 :=是Python3.8引入的赋值表达式(也叫海象运算符),这里的作用是:对每个子节点o递归调用filter_orgs(o),把返回结果直接赋值给变量org,同时判断这个返回结果是否为真值- 如果递归返回了有效节点对象(说明这个子节点自身可用,或者它的后代存在可用节点),就把处理后的
org加入当前的子节点结果列表 - 如果递归返回
None(说明这个子节点自身不可用,所有后代也没有可用节点,整个分支无效),就直接跳过,不加入结果列表
- 如果递归返回了有效节点对象(说明这个子节点自身可用,或者它的后代存在可用节点),就把处理后的
2. 节点保留判断逻辑
if orgs or source["available"]: return { "org_name": source["org_name"], "orgs": orgs }
只要满足两个条件任意一个,当前节点就会被保留,返回构造后的新节点对象:
- 条件1:
orgs不为空,说明当前节点的子级中存在有效分支,哪怕自身available标记为False,也需要保留当前节点作为父节点承托下层有效节点(示例中的5号、8号节点就属于这种情况) - 条件2:
source["available"]为True,说明当前节点自身是可用状态,哪怕没有任何子节点也需要保留 - 如果两个条件都不满足,函数会默认返回
None,代表当前节点所在的整个分支都是无效的,会被上层过滤掉
对照示例的执行流程梳理
从最底层叶子节点向上递归的处理过程和结果完全匹配你给出的输出:
- 处理根节点1的直接子节点2、3:两个节点自身
available都是False,且没有子节点,递归返回None,直接被过滤 - 处理节点4:自身
available为True,没有子节点,满足保留条件,返回结构{"org_name": "4", "orgs": []},加入上层子节点列表 - 处理节点5:自身
available为False,递归处理它的三个子节点:- 节点6、7:自身不可用、无有效子节点,返回
None被过滤 - 处理节点8:自身
available为False,递归处理它的两个子节点:- 节点9:自身不可用、无有效子节点,返回
None被过滤 - 节点10:自身
available为True,无有效子节点,满足保留条件,返回后加入节点8的子节点列表
- 节点9:自身不可用、无有效子节点,返回
- 节点8的子节点列表不为空(存在有效节点10),满足保留条件,返回处理后的结构加入节点5的子节点列表
- 节点6、7:自身不可用、无有效子节点,返回
- 节点5的子节点列表不为空(存在有效节点8的分支),满足保留条件,返回处理后的结构加入根节点1的子节点列表
- 根节点1自身
available为True,子节点列表包含保留下来的4、5两个节点分支,最终返回的结构就和你运行得到的输出完全一致
注:输出结果中没有
available字段是正常的,因为函数构造返回的新节点时,只保留了org_name和orgs两个键,没有携带原节点的available属性。
内容的提问来源于stack exchange,提问作者tonyy frank
相关产品推荐
相关产品推荐

