Присоединение словарей к таблице - PullRequest
0 голосов
/ 10 мая 2018

Я получаю таблицу, когда присоединяюсь к словарям с одинаковыми ключами:

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 голосов
/ 11 мая 2018

Другой вариант - использовать 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

Таким образом, наиболее эффективным является, конечно, если вы знаете все возможные ключи. Но все равно лучше использовать #, если вы просто хотите использовать все ключи из списка словарей

0 голосов
/ 10 мая 2018

Вы можете использовать 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

Обратите внимание, что мы сначала создали отдельный словарь для таблицы перед присоединением.

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
...