#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