加入词典制作 table

Joining dictionaries to make a table

当我用相同的键加入字典时,我得到一个 table :

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

s  p 
-----
s1 p1
s2 p2

但如果键不同,它只是 returns 列表,有没有办法生成正确的 table?

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

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

您可以使用 uj 和副词 over 来获得 table:

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

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

请注意,我们在加入之前先将个人词典制作成table。

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

另一种选择是使用 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

所以最有效的当然是你知道所有可能的键。但是如果你只想使用字典列表中的所有键,那么使用 # 仍然要快一些