KDB:从字典就地删除

San*_*nny 3 dictionary kdb

要将元素向上插入字典,我会

q) d[`x]:12345
Run Code Online (Sandbox Code Playgroud)

这将修改现有的字典,并且操作成本接近O(1)O(log N)取决于基础实现(哈希表或树)(我不知道)。

但是,要删除密钥,我必须使用:

q) d:(enlist `x) _ d
Run Code Online (Sandbox Code Playgroud)

这至少O(N)是因为它复制了完整的词典而不删除其中的项目,O(N)然后由于指针而将其分配给dO(1)

这看起来像删除操作歧视!也许就地删除没有很好的文档记录,但是存在于某个地方?

Sea*_*gan 5

2种方式:

d _:`x

或者

delete x from `d


Ale*_*sky 5

还有两个选项适用

.[`d;();_;`x]
Run Code Online (Sandbox Code Playgroud)

功能删除

![`d;();0b;enlist`x]
Run Code Online (Sandbox Code Playgroud)

如果要一次性删除多个键,则最后一种形式很有用。例如,

![`d;();0b;`x`y]
Run Code Online (Sandbox Code Playgroud)


SJT*_*SJT 5

四种形式支持就地删除

跌落通过分配允许你删除一个单个密钥 “到位”。

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
Run Code Online (Sandbox Code Playgroud)

Apply将允许您参数化密钥

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
Run Code Online (Sandbox Code Playgroud)

delete像所有Q-SQL模板一样,通过引用调用也支持“就地”,并且还允许您放下多个键

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
Run Code Online (Sandbox Code Playgroud)

功能删除支持多个键,并允许您参数化键。(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
Run Code Online (Sandbox Code Playgroud)

上面的链接是kdb +文档站点code.kx.com