我有一个包含多个标志的表,我想将这些标志映射到它们所代表的值。
tab:([] t:til 4 ; f1:1100b;f2:1010b;f3:0101b;f4:0011b )
如何简化这些多个更新语句?
tab:update f1s:`googl from tab where f1
tab:update f2s:`appl from tab where f2
tab:update f3s:`amzn from tab where f3
答案 0 :(得分:5)
update f1s:``googl f1,f2s:``appl f2,f3s:``amzn f3 from `tab
您可以将符号放在列表中并使用布尔值将其编入索引
答案 1 :(得分:1)
更实用的解决方案
q)@/[tab;`f1`f2`f3;(``goog;``appl;``amzn)]
t f1 f2 f3 f4
-------------------
0 goog appl 0
1 goog amzn 0
2 appl 1
3 amzn 1
答案 2 :(得分:0)
您可以使用向量条件运算符?
:
?[vb;exprtrue;exprfalse]
Simplfied声明:
update f1s:?[f1;`googl ;`], f2s:?[f2;`appl ;`], f3s:?[f3;`amzn ;`] from tab
答案 3 :(得分:0)
也可以通过使用词典来实现:
tab:([] t:til 4 ; f1:1100b;f2:1010b;f3:0101b;f4:0011b )
g:01b!``googl
ap:01b!``appl
az:01b!``amzn
update f1s:g@f1, f2s:ap@f2, f3s:az@f3 from tab
这在单列中有多个值的情况下特别有用:
q)tab:([] t:til 4 ; f1:1 2 0 4;f2:2 3 4 1;f3:1 4 3 1 ;f4:1 1 0 0 )
q)m:1 2 3!`googl`appl`amzn
q)update f1s:m@f1, f2s:m@f2, f3s:m@f3 from tab
t f1 f2 f3 f4 f1s f2s f3s
-------------------------------
0 1 2 1 1 googl appl googl
1 2 3 4 1 appl amzn
2 0 4 3 0 amzn
3 4 1 1 0 googl googl