Разгруппировать словарь - PullRequest
0 голосов
/ 17 марта 2019

Предположим, что родительский вектор p определен как список, где каждый элемент является указателем на индекс позиции родителя данного элемента в том же векторе.Тогда дочерние элементы каждого родителя можно найти как:

q) c:group p:0N 0 1 0 2
 | ,0
0| 1 3
1| ,2
2| ,4

Если задано c, каков эффективный способ выравнивания словаря детей c обратно к родительскому вектору p?

Очевидно, ungroup не работает напрямую со словарями:

q) ungroup c
'type

Но мы можем разгруппировать таблицы:

q) {@[;`k] `v xasc ungroup ([]k:key x;v:value x)} c
0N 0 1 0 2

Есть ли более эффективное решение, как получить p с учетомc?

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Не существует встроенной команды q для типа разгруппировки, который вы ищете. Одним из вариантов, который может быть полезен, является следующая функция:

invgroup:{key[x]@[raze x;value x;:;til count x]}

Эффективно то, что это делает, возвращает значения словаря группы в виде единого списка (raze x), индексирует в этот список каждый набор связанных индексов (значение x) и присваивает им правильный индекс из исходного списка. Затем мы используем эти индексы для индексации отдельных значений исходного списка (ключ x), чтобы вытащить исходный список

p ~ invgroup group p:0N 0 1 0 2
1b
1 голос
/ 18 марта 2019

Простое решение:

 q) @[raze c;value c;:;key c] 
 q) 0N 0 1 0 2
...