Kdb 把字典拼成一张桌子
当我使用相同的键连接字典时,我得到一个表:Kdb 把字典拼成一张桌子,kdb,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 您可以使用uj和副词over来获取表格: q)(uj)over enlist each ((`s`p!`s1`p1);(`s`p`m!`s2`p2
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
您可以使用
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
请注意,在加入之前,我们首先将单个词典添加到表中
当有两个以上的词典时,上方的特别有用。
否则,单独使用uj
就可以做到这一点
q)(enlist `s`p!`s1`p1) uj (enlist `s`p`m!`s2`p2`m2)
s p m
--------
s1 p1
s2 p2 m2
另一个选项是使用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
所以最有效的方法当然是你知道所有可能的钥匙。但是如果您只想同时使用字典列表中的所有键,那么使用#
仍然要快一点但是这里的问题是take(#)不知道要符合什么数据类型。碰巧在这个例子中,所有的数据类型都是符号,所以数据类型是一致的。如果您有类似于s
pm/:(
sp!
s1p1);(
sp
m!(s2;
s3;1i)),那么第一个字典中的“m”将不会与第二个字典中的“m”具有相同的类型,除非是偶然的。uj方法将尽可能创建统一的数据类型