【发布时间】:2021-02-02 18:57:14
【问题描述】:
我希望能够在给定`a`b`c 列表的情况下构造(+; (+; `a; `b); `c)
同样,如果我有`a`b`c`d 的列表,我希望能够构建另一个巢,依此类推,以此类推。
我一直在尝试使用扫描,但我无法正确使用它
【问题讨论】:
标签: kdb
我希望能够在给定`a`b`c 列表的情况下构造(+; (+; `a; `b); `c)
同样,如果我有`a`b`c`d 的列表,我希望能够构建另一个巢,依此类推,以此类推。
我一直在尝试使用扫描,但我无法正确使用它
【问题讨论】:
标签: kdb
q)fsum:(+;;)/
enlist[+;;]/
q)fsum `a`b`c`d
+
(+;(+;`a;`b);`c)
`d
【讨论】:
如果您只想要原始解析树输出,一种方法是形成等效字符串并使用parse。对于更复杂的示例不建议这样做,但在这种情况下很清楚。
{parse "+" sv string x}[`a`b`c`d]
+
`d
(+;`c;(+;`b;`a))
如果您希望在功能选择中使用它,我们可以使用 +/ 而不是像您在示例中指定的那样单独添加每一列
q)parse"+/[(a;b;c;d)]"
(/;+)
(enlist;`a;`b;`c;`d)
q)f:{[t;c] ?[t;();0b;enlist[`res]!enlist (+/;(enlist,c))]};
q)t:([]a:1 2 3;b:4 5 6;c:7 8 9;d:10 11 12)
q)f[t;`a`b`c]
res
---
12
15
18
q)f[t;`a`b]
res
---
5
7
9
q)f[t;`a`b`c]~?[t;();0b;enlist[`res]!enlist (+;(+;`a;`b);`c)]
1b
您还可以通过直接索引来获得总和,以返回每列值的列表并对这些值求和。我们使用(), 将任何输入变成一个列表,否则它将对该单列中的值求和并仅返回一个值
q)f:{[t;c] sum t (),c}
q)f[t;`a`b`c]
12 15 18
【讨论】: