Разгруппировать словарь

#kdb

#kdb

Вопрос:

Предположим, родительский вектор 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 given c ?

Ответ №1:

Нет собственной команды 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
  

Ответ №2:

Простым решением является:

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