KDB中如何用uj合并任意长度字典?匹配键取值并集
合并字典列表:匹配键取并集,新键直接插入
uj函数无法实现这个需求,因为uj(更新连接)的逻辑是用后续字典的键值对覆盖前面的,所以(uj)/:会直接返回最后一个字典,和你遇到的情况一致。
要实现目标效果,可按以下思路编写代码:
dd1:(`a`b`c)!(1 2; 3 4; 5 6); dd2:(`b`c`d)!(7 8; 9 10; 0 1); dd3:(`a`f`e)!(3 4; 1 1; 2 2); // 合并逻辑 dicts: (dd1; dd2; dd3); allKeys: distinct raze keys each dicts; mergedVals: {raze x} each {[k] v where not null v: get[k] each dicts} each allKeys; result: allKeys!mergedVals;
执行后result即为期望结果:
(`a`b`c`d`e`f)!(1 2 3 4; 3 4 7 8; 5 6 9 10; 0 1; 2 2; 1 1)
关键步骤拆解:
allKeys: distinct raze keys each dicts:将所有字典的键展开后去重,得到最终字典的完整键集合{[k] v where not null v: get[k] each dicts} each allKeys:针对每个键,遍历所有字典提取对应值,过滤掉不存在该键时产生的null值{raze x} each ...:把每个键对应的多个值列表合并成单个列表
也可以用更简洁的写法:
result: {[ks] ks!{raze x} each {get[;x]}[dicts] each ks} distinct raze keys each dicts
内容的提问来源于stack exchange,提问作者michel
相关产品推荐
相关产品推荐

