加入词典制作表格

时间:2018-05-10 18:58:14

标签: kdb

当我用相同的键加入词典时,我得到一张表:

q)((`s`p!`s1`p1);(`s`p!`s2`p2))

s  p 
-----
s1 p1
s2 p2

但是如果键不同,它只返回列表,有没有办法生成一个合适的表?

q)((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))

`s`p!`s1`p1
`s`p`m!`s2`p2`m2

2 个答案:

答案 0 :(得分:5)

您可以使用uj和副词over来获取表格:

q)(uj)over enlist each ((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))

s  p  m 
--------
s1 p1   
s2 p2 m2

请注意,我们在加入之前首先将单个字典制作成表格。

当有超过2个词典时,over特别有用。 否则单独使用uj可以解决问题。

q)(enlist `s`p!`s1`p1) uj (enlist `s`p`m!`s2`p2`m2)

s  p  m 
--------
s1 p1   
s2 p2 m2

答案 1 :(得分:4)

另一个选择是使用take #使字典的键统一

q)`s`p`m#/:((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))
s  p  m
--------
s1 p1
s2 p2 m2

如果需要,您可以使用(union/) key each之类的内容将所有词典的键组合成一个唯一键列表

q)((union/)key each d)#/:d:((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))
s  p  m
--------
s1 p1
s2 p2 m2

比较执行时间&内存使用的不同选项

q)\ts:1000 (uj)over enlist each ((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))
53 2288
q)\ts:1000 `s`p`m#/:((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))  
13 1920
q)\ts:1000 ((union/)key each d)#/:d:((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))
22 2880

因此,如果您知道所有可能的密钥,那么效率最高。但如果您只想使用字典列表中的所有键,那么使用#仍然会更快一些