如何编写Kdb+函数将列表拆分为指定大小的子集?
解决Kdb+列表按指定长度拆分的问题
正确的拆分函数
通过计算每个子集的起始索引,可实现批量拆分:
splitList:{[lst;sizes] lst each (0, sums sizes except last) +/: til each sizes}
测试验证
q)list:`a`b`c`d`e`f`g`h`i q)splitList[list;2 3 4] `a`b `c`d`e `f`g`h`i
函数逻辑解析
sizes except last:排除最后一个长度,避免生成多余的起始位置sums ...:对剩余长度做累积求和,得到后续子集的起始偏移量(此处为2,5)0, ...:拼接初始起始位置0,得到完整的起始索引列表0,2,5+/: til each sizes:将每个起始索引与对应长度的索引序列(til 2/til3/til4)相加,生成每个子集的索引范围lst each ...:用原列表批量提取对应索引的元素,得到拆分后的结果
简化写法
也可直接截取前n-1个长度做累积求和:
splitList2:{[lst;sizes] lst each (0, sums sizes[:-1]) +/: til each sizes}
错误原因分析
你之前的函数始终从索引0开始提取元素,没有动态更新起始位置。核心问题是未计算每个子集的起始偏移量,通过累积求和sums可解决该问题,让每个子集的起始位置等于前一个子集的长度之和。
内容的提问来源于stack exchange,提问作者Rajasekhar
相关产品推荐
相关产品推荐

