如何稳定地将列表中的零移至末尾?Q语言实现优化求助
将列表中的零移至末尾并保持非零元素相对顺序(Kdb+/Q语言)
需求:把列表中的所有零移到末尾,同时保持非零元素的原有相对顺序,预期结果为 2 4 3 2 0 0。
错误尝试分析
使用idesc函数的问题在于,它会生成整个列表的降序排列索引,直接通过该索引取元素会对所有元素进行降序排序,而非仅移动零:
q)list:2 4 3 0 2 0 q)list (idesc list) 4 3 2 2 0 0
这种方式改变了非零元素的原有顺序,不符合需求。
现有可行实现
你当前的实现方法已经能正确得到预期结果:
q){(x where x<>0), x where x=0}[list] 2 4 3 2 0 0
该方法通过两次筛选,先取出所有非零元素,再拼接所有零元素,逻辑直观且正确。
优化方案
如果希望更紧凑的写法,或者减少一次列表遍历(对大列表性能略有提升),可以通过拼接索引的方式实现:
q)list@raze where each (list<>0; list=0) 2 4 3 2 0 0
或者封装成函数:
q){x@raze where each (x<>0;x=0)}[list] 2 4 3 2 0 0
这种方式先分别获取非零元素和零元素的索引,拼接后再取原列表的对应元素,本质和原方法的时间复杂度一致,但写法更紧凑。
如果追求极致可读性,原有的{(x where x<>0), x where x=0}仍是最优选择,逻辑清晰易懂。
内容的提问来源于stack exchange,提问作者Rajasekhar
相关产品推荐
相关产品推荐

