KDB: удаление на месте из словаря

Чтобы добавить элемент в словарь, я делаю

q) d[`x]:12345

Это изменяет существующий словарь, а стоимость операции близка к O(1) или O(log N) в зависимости от базовой реализации (хэш-таблица или дерево) (на самом деле я не знаю).

Однако, чтобы удалить ключ, я должен использовать:

q) d:(enlist `x) _ d

Это как минимум O(N), потому что он копирует полный словарь без удаления элементов в O(N), а затем присваивает его d в O(1) из-за указателя.

Это похоже на удаление операции дискриминации! Может быть, удаление на месте плохо документировано, но где-то существует?


person Sanny    schedule 21.10.2017    source источник


Ответы (3)


Еще два параметра включают применить:

.[`d;();_;`x]

функциональное удаление

![`d;();0b;enlist`x]

Последняя форма полезна, если вы хотите удалить несколько ключей за один раз. Например.,

![`d;();0b;`x`y]
person Alexander Belopolsky    schedule 21.10.2017
comment
Спасибо, есть какие-нибудь советы о том, как реализовать множественное удаление вложенного словаря на месте? большой[a;b]:3 ; big[a] _: b / удаляет только один, мне нужно удалить много - person Sanny; 22.10.2017
comment
Если ваш вложенный словарь сопоставляет символы с общими значениями, вы должны иметь возможность использовать либо шаблон удаления, либо функциональное удаление. Я обновлю ответ, чтобы избежать ограничения на количество символов в комментариях. - person Alexander Belopolsky; 22.10.2017
comment
Вы пробовали ![`large.a;();0b;`b`c]? - person Alexander Belopolsky; 30.10.2017

Четыре формы поддерживают удаление на месте.

Перетаскивание через назначение позволяет перетаскивать один ключ "на месте".

q)show d:`a`b`c`x!(1;2 3;4;5)
a| 1
b| 2 3
c| 4
x| 5
q)d _: `x
q)d
a| 1
b| 2 3
c| 4

Применить позволит вам параметризировать ключ:

q)show d:`a`b`c`x!(1;2 3;4;5)
a| 1
b| 2 3
c| 4
x| 5
q).[`d;();_;`x]
q)d
a| 1
b| 2 3
c| 4

delete, как и все шаблоны Q-SQL, аналогичным образом поддерживает "на месте" через call- по ссылке, а также позволяет перетаскивать несколько ключей:

q)show d:`a`b`c`x!(1;2 3;4;5)
a| 1
b| 2 3
c| 4
x| 5
q)delete x,b from `d
`d
q)d
a| 1
c| 4

Функциональное удаление поддерживает несколько ключей и позволяет параметризовать ключи. (Используйте parse, чтобы увидеть функциональную форму шаблона Q-SQL.)

q)show d:`a`b`c`x!(1;2 3;4;5)
a| 1
b| 2 3
c| 4
x| 5
q)parse "delete x,b from d"
!
`d
()
0b
,`x`b
q)![`d;();0b;`x`b]
`d
q)d
a| 1
c| 4

Ссылки выше ведут на сайт документации kdb+ code.kx.com.

person SJT    schedule 22.10.2017

2 способа:

d _:`x

or

delete x from `d

person Sean O'Hagan    schedule 21.10.2017