Hy语法下如何实现冲突键后者优先的两字典合并操作?
Hy 实现后者优先规则的字典合并写法
Hy 作为运行在Python虚拟机上的Lisp方言,和你写的Python合并逻辑是1:1映射的,完全保留「后出现的字典解包项,对冲突键值有更高优先级」的规则,具体写法如下:
- 核心实现代码
;; 初始化测试字典 (setv x {'a 1 'b 2}) (setv y {'b 3 'c 4}) ;; 后者优先的合并表达式 ;; 运行结果: {'a': 1, 'b': 3, 'c': 4} (print {**x **y})
- 语法规则说明
- Hy的字典字面量使用
{}包裹构造,内部的键值对、解包项直接用空白分隔即可,不需要像Python那样插入逗号分隔 - 解包标识符
**的作用和Python完全一致,按书写顺序把对应字典的键值对依次塞入最终生成的字典;这种解包操作既可以在{}字典字面量里使用,也可以作为dict构造函数的参数,两种写法效果完全等价 - 因为
y写在解包序列的后段,所以当x和y存在冲突键'b'时,y里的取值会直接覆盖x里的对应值,完全匹配后者优先的合并要求
- Hy的字典字面量使用
- 老旧版本兼容写法
如果使用的Hy版本过老,不支持字典字面量内的解包语法,可以通过字典的update方法实现同等逻辑:
;; 基于x创建新字典,避免修改原字典 (setv merged (dict x)) ;; 把y的键值对合并到新字典,存在冲突时直接覆盖 (.update merged y)
内容的提问来源于stack exchange,提问作者Namudon'tdie
相关产品推荐
相关产品推荐

