加入词典制作表格

1 kdb

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

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

s  p 
-----
s1 p1
s2 p2
Run Code Online (Sandbox Code Playgroud)

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

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

`s`p!`s1`p1
`s`p`m!`s2`p2`m2
Run Code Online (Sandbox Code Playgroud)

nyi*_*nyi 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
Run Code Online (Sandbox Code Playgroud)

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

over当有超过2个词典时,它特别有用.否则uj单独使用可以做到这一点.

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

s  p  m 
--------
s1 p1   
s2 p2 m2
Run Code Online (Sandbox Code Playgroud)


Jon*_*ray 5

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

q)`s`p`m#/:((`s`p!`s1`p1);(`s`p`m!`s2`p2`m2))
s  p  m
--------
s1 p1
s2 p2 m2
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以使用类似的(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
Run Code Online (Sandbox Code Playgroud)

比较不同选项的执行时间和内存使用情况

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
Run Code Online (Sandbox Code Playgroud)

因此,如果您知道所有可能的密钥,那么效率最高.但是,#如果您只想使用字典列表中的所有键,那么使用起来还是要快得多

  • 这里的问题是take(#)不知道要符合的数据类型.恰好在这个例子中,所有数据类型都是符号,因此数据类型符合.如果你有类似`s`p`m#/ :((`s`p!`s1`p1);(`s`p`m!(`s2;`s3; 1i)))那么"m "在第一个字典中,除了偶然之外,第二个字典中的"m"类型不同.uj方法将尽可能创建统一的数据类型 (3认同)