(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
有例子
(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