(q/kdb+) 如果两个数字相等,则用零替换左边的数字

(q/kdb+) replace left number in a pair by zero if both numbers are equal

有例子

(7.5 7.5;5.1 5.5;0.0 3.0;1.0 1.0)

index   value
0   7.5 7.5
1   5.1 5.5
2   0 3f
3   1 1f

如果两个数字相等,如何将每对中左边的数字替换为零?

示例输出

index   value
0   0 7.5
1   5.1 5.5
2   0 3f
3   0 1f

谢谢

{(x[;0]*not x[;0]=x[;1]),'x[;1]} value

随着列表长度变得非常大,此函数应该保持良好的性能

一个简单的方法是使用 each 副词。

{$[x[0]=x[1];0,x[1];x]} each (7.5 7.5;5.1 5.5;0.0 3.0;1.0 1.0)

此处左侧的 if/else 函数采用两项列表,returns 列表,如果两项匹配,则用 0 替换第一项。 each 副词将此功能单独应用于列表中的每对数字。

你也可以在向量上使用点修正

q)a:(7.5 7.5;5.1 5.5;0.0 3.0;1.0 1.0)
q){.[x;(where (=) . flip x;0);:;0f]} a
0   7.5
5.1 5.5
0   3
0   1