KDB+如何遍历两个等长列表 按条件替换对应位置字符串
KDB+ 按对应位置条件执行字符串替换实现方案
核心实现
直接利用KDB+原生向量条件运算符搭配ssr字符串替换函数即可实现,无需编写显式循环。
首先初始化测试数据(注意原示例中list2的逗号分隔为笔误,KDB+列表元素需用分号分隔):
list1:("Boy";"Toy";"Coy";"Poy") list2:("A";"B";"A";"B")
简洁版写法(适合中小规模数据)
一行代码即可完成替换:
result:?[list2="B";ssr[;"oy";"ab"]each list1;list1]
逻辑说明:
list2="B"生成与列表等长的布尔向量,逐位置标记是否满足替换要求ssr[;"oy";"ab"]each list1对list1中每个字符串执行子串替换,将"oy"替换为"ab",生成全量替换后的临时列表- 向量三元运算符
?[cond;true_val;false_val]按位置匹配:对应位置list2值为"B"时取替换后的值,否则保留list1原始值
执行后返回结果完全符合预期:
q)result "Boy" "Tab" "Coy" "Pab"
高性能版写法(适合超大规模数据集)
如果列表长度极大,且满足替换条件的元素占比低,可以先定位需要替换的索引,仅对目标位置执行替换,避免无意义的全量计算:
result:list1 target_ind:where list2="B" result[target_ind]:ssr[;"oy";"ab"]each result[target_ind]
两种写法返回结果完全一致,后者在处理千万级以上长度列表时性能优势明显。
内容的提问来源于stack exchange,提问作者Jack Sparrow
相关产品推荐
相关产品推荐

