Другой вариант - использовать 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
Таким образом, наиболее эффективным является, конечно, если вы знаете все возможные ключи. Но все равно лучше использовать #
, если вы просто хотите использовать все ключи из списка словарей