kdb/Q技术咨询:如何在函数中返回最优列表及对应指标
Kdb/Q函数返回多结果的实现疑问
我有一个关于kdb/Q函数的技术疑问:函数接收一个数字列表,修改其中一个数值生成新列表后,通过calculate_metric计算两个列表的指标(指标为列表元素求和值),希望返回指标更优的列表以及对应的指标值。现有示例函数仅能返回列表,请问如何实现同时返回这两个结果?
示例代码如下:
original_list = [1 2 3] def my_function:{[original_list] # create a new list, changing just one value new_list = change_one_number[original_list] # generate the metrics for both lists original_metric = calculate_metric[original_list] new_metric = calculate_metric[new_list] #if statement here ?[new_metric >= original_metric; new_list; original_list]} ^ ^ #these outputs are just the list though
解决方案
在kdb/Q里,要同时返回多个结果,最直接的方式是返回元组或者字典,把列表和对应的指标值打包在一起返回。
方法1:返回元组
元组是kdb/Q存储多值的基础结构,用括号()包裹元素即可。修改后的函数会根据指标比较结果,返回(最优列表; 对应指标值)的元组:
my_function:{[original_list] new_list: change_one_number[original_list]; original_metric: calculate_metric[original_list]; new_metric: calculate_metric[new_list]; ?[new_metric >= original_metric; (new_list; new_metric); (original_list; original_metric)] }
调用后可通过索引访问结果:比如result: my_function[1 2 3];,result[0]取最优列表,result[1]取对应指标值。
方法2:返回字典(可读性更强)
如果希望结果更清晰,可返回字典,通过键名直接获取对应值:
my_function:{[original_list] new_list: change_one_number[original_list]; original_metric: calculate_metric[original_list]; new_metric: calculate_metric[new_list]; ?[new_metric >= original_metric; `best_list`best_metric!(new_list; new_metric); `best_list`best_metric!(original_list; original_metric)] }
调用后比如result: my_function[1 2 3];,可用result[best_list]获取最优列表,result[best_metric]获取指标值。
注意事项
- kdb/Q中赋值符号为
:,示例代码里的=需要替换为:才能正常运行。 - 若
calculate_metric是求和逻辑,可简单实现为calculate_metric:{sum x;},其他逻辑按需替换即可。
内容的提问来源于stack exchange,提问作者mmv456
相关产品推荐
相关产品推荐

