kdb как удалить строковый ключ из словаря

У меня возникли трудности с удалением записи из словаря KDB. Ключи и значения являются строками.

Работает

q)l3:`a`b`c!1 2 3
q)`a _l3
b| 2
c| 3

Не работает

q)l2:("k1";"k2";"ABC")!("v1";"v2";"BLA BLA")
q)"k1" _l2
'type

Спасибо, Евгений


kdb
person Vortex    schedule 10.11.2014    source источник


Ответы (2)


Поскольку тип «списка ключей» в вашем словаре равен 0h (смешанный список или список списка)

     q) type ("k1";"k2";"ABC")
     q) 0h

и тип вашего единственного ключа 10h (строка)

     q)  type "k1"
     q) 10h

Вот почему при сопоставлении kdb выдает ошибку типа.
Ссылка: http://code.kx.com/q4m3/5_Dictionaries/

В нем говорится: «Левый операнд удаления — это словарь (цель), а правый операнд — значение ключа, тип которого соответствует типу цели».

Вы можете использовать следующее, чтобы удалить запись:

      q)   (k@where not (k:key l2) like "k1")#l2

Key Value
k2  v2
ABC BLA BLA
person Rahul    schedule 10.11.2014
comment
Очень признателен. Ключевым моментом, который вы сделали, является то, что строковые ключи - это список [список]. - person Vortex; 14.11.2014

Я думаю, вы должны использовать enlist, чтобы удалить ключ строки из словаря:

q)enlist["k1"]_("k1";"k2";"ABC")!("v1";"v2";"BLA BLA")
"k2" | "v2"
"ABC"| "BLA BLA"

_(drop) принимает левый ввод как список элементов словарного ключа (за исключением символьного ключа). Попробуйте представить, что в вашем случае «k1» — это «атом», и для создания одноэлементного списка вы можете просто enlist «k1».

Ссылка: http://code.kx.com/q/ref/lists/#_-cut

person WooiKent Lee    schedule 10.11.2014
comment
k1 сам по себе является списком (строкой). 'enlist k1' преобразует этот список в тип 0h и, следовательно, он будет работать, поскольку 'key l2' имеет тип 0h в примере с Vortex. - person Rahul; 10.11.2014