ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

dpath-python高级过滤技巧:用afilter自定义函数精准筛选字典值

dpath-python高级过滤技巧:用afilter自定义函数精准筛选字典值 dpath-python高级过滤技巧用afilter自定义函数精准筛选字典值【免费下载链接】dpath-pythonA python library for accessing and searching dictionaries via /slashed/paths ala xpath.项目地址: https://gitcode.com/gh_mirrors/dp/dpath-pythondpath-python 是一个让 Python 字典像文件系统一样可查询的路径库用/a/b/c这样的路径即可访问任意层级的值。它最被低估的高级功能是afilter——传入一个自定义过滤函数按值的内容而非键名来精准筛选字典值。本文带你用 5 分钟掌握 afilter 的全部实用技巧。一、认识 dpath-python把字典当文件系统来查 在 dpath-python 中字典的每个键就像文件系统里的一个目录名用/分隔路径、用*和**做通配匹配类似 XPath 的思想。安装只需一条命令pip install dpath最小示例感受一下路径查询的直观性import dpath x {a: {b: {3: 2, 43: 30}}} dpath.get(x, /a/b/43) # - 30但get/search默认只能按键名匹配。当你想问帮我找出所有值大于 100 的节点时就轮到 afilter 登场了。二、afilter 是什么一个函数决定留还是删afilter 是一个简单的回调函数接收一个值返回True保留或False丢弃。官方把它定义为类型别名Filter Callable[[Any], bool]见 dpath/types.py。工作原理一句话概括先按路径 glob 匹配节点再对每个节点调用你的 afilter只有返回 True 的值才会进入结果集。核心判断逻辑在 dpath/init.py 的keeper函数中。三、5 分钟上手写出第一个 afilter 过滤器 假设字典里有一批Waffles风格的值你只想找出值中包含 ffle 字样的键def afilter(value): return ffle in str(value) result dpath.search(x, **, afilterafilter)**表示所有节点afilter 负责二次过滤。返回的result是一棵只含命中节点的子树。如果不想合并成字典而是逐个迭代(路径, 值)元组加一个yieldedTrue即可for path, value in dpath.search(x, **, yieldedTrue, afilterafilter): print(path, value)四、4 个实用过滤技巧清单 ✂️技巧 1按值内容筛选包含/前缀/后缀str(value)转型后做字符串判断是最常用的姿势dpath.search(x, **, afilterlambda v: v.endswith(.py))技巧 2用正则表达式做严格匹配afilter 里可以跑任何 Python 逻辑正则只是冰山一角import re dpath.search(x, **, afilterlambda v: re.fullmatch(r\d, str(v)))上面只保留值完全是纯数字的节点。技巧 3按数值范围筛选dpath.values(x, **, afilterlambda v: isinstance(v, (int, float)) and v 10)values是search的简写直接返回所有命中值的列表。技巧 4按类型筛选只想要字符串值只想要布尔值isinstance交给 afilter 即可一行搞定无需自己递归遍历字典。五、afilter 能用在哪些函数上函数支持 afilter作用dpath.search✅返回过滤后的匹配子树dpath.values✅返回过滤后的值列表dpath.delete✅只删除满足条件的键值dpath.set✅只批量修改满足条件的值dpath.merge✅只合并源数据中满足条件的部分dpath.get/dpath.new❌单点取值/新建节点不支持各函数的 afilter 实现分别在 dpath/init.pydelete/set、dpath/init.pyvalues、dpath/init.pysearch。六、新手必知的 3 个坑 ⚠️必须返回布尔值afilter 收到 True 才保留、False 才丢弃返回其他值会按假值处理建议显式写return True / False。delete 和 set 中afilter 只作用于叶子值源码里先做了segments.leaf(value)判定见 dpath/segments.py字典、列表这类容器节点不会触发你的过滤函数。glob 与 afilter 是与关系在search/values/set中节点必须先命中路径 glob再进入 afilter 判定。想全量过滤就用**作为 glob。关于 afilter 边界行为的完整验证可参考测试用例 tests/test_broken_afilter.py。七、延伸阅读与文件资料 dpath/init.pysearch、values、delete、set、merge的 afilter 实现dpath/types.pyFilter类型别名定义dpath/segments.py叶子节点判定leaf()tests/test_broken_afilter.pyafilter 行为测试README.rst官方 Filtering 章节的完整示例掌握 afilter 后你会发现 dpath-python 不仅能按路径找字典更能按条件筛字典——递归遍历、条件判断、结果重组统统不需要手写一行循环。【免费下载链接】dpath-pythonA python library for accessing and searching dictionaries via /slashed/paths ala xpath.项目地址: https://gitcode.com/gh_mirrors/dp/dpath-python创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表