字典
概述
字典是一种容器类型,包含唯一的键值对列表。其中:
-
键必须是标量。键支持的数据类型为Integral类(compress除外)、Temporal类、Floating类和Literal类。值可以是任何数据形式与数据类型。
-
键可以增加,但不可更新;值可以更新。
字典分为无序字典与有序字典两种类型。无序字典在输出或进行遍历时,其键值对不保留输入时的顺序;有序字典在输出或进行遍历时,键值对的顺序与输入顺序保持一致。DolphinDB 内置函数所返回的字典一般为有序字典,如使用 transpose 对表转置后的输出、JSON 字符串解析输出、机器学习模型输出,以及各类统计信息输出的字典。
有序字典和无序字典对各类函数的支持情况:
字典类型 | 单目函数 | 双目函数 | 窗口函数 | 聚合函数 |
---|---|---|---|---|
无序字典 | 支持 | 支持,另一个参数只能是字典或标量 | 不支持 | 不支持 |
有序字典 | 支持 | 支持 | 支持 | 不支持 |
创建字典
用函数 dict 或 syncDict 创建一个字典,其中X表示键,Y表示值,参数 ordered 控制是否创建有序字典。dict 函数创建的字典不允许并发读写,syncDict 函数创建的字典允许并发读写。
x=1 2 3 1; y=2.3 4.6 5.3 6.4; z=dict(x, y); //注意重复键1的存在 z; 3->5.3 2->4.6 1->6.4 //当有重复键存在时,其值以最后一个值为准。 z=dict(y, x); z; 6.4->1 5.3->3 4.6->2 2.3->1 $z=dict(y,x,true) $z; 2.3->1 4.6->2 5.3->3 6.4->1 //创建有序字典,键的输出顺序与输入顺序一致
也可用指定数据类型的键和值来创建空字典,然后在字典中插入(键, 值)数据对。
// 创建一个空字典,其键类型是整数,值类型是双精度浮点。 z=dict(INT,DOUBLE); // 插入一个新元素,1是键,7.9是值。 z[1]=7.9; z; 1->7.9 // 更新值 z[1]=6.3; z; 1->6.3; z[-1]=1000; z; -1->1000 1->6.3```
我们可以用函数 dict (string, any)来创建一个值为不同数据类型的字典。
z=dict(STRING,ANY) z[`IBM]=172.91 173.45 171.6 z[`MS]=29.11 29.03 29.4 z[`SECOND]=10:30:01s 10:30:03s 10:30:05s z[`TOTAL]=3 z; SECOND->[10:30:01,10:30:03,10:30:05] MS->[29.11,29.03,29.4] TOTAL->3 IBM->[172.91,173.45,171.6]
访问字典
x=3 6 1 5 9 y=4.2 3.7 8.8 6.4 5.3 z=dict(x, y) z; 9->5.3 5->6.4 1->8.8 6->3.7 3->4.2 keys z; [9,5,1,6,3] // 取得一个字典的所有键 values z; [5.3,6.4,8.8,3.7,4.2] // 取得一个字典的所有值 size z; 5 z[9]; 5.3 z[5 3]; [6.4,4.2] z.3; 4.2; z.(3 5); [4.2,6.4] x=dict(`IBM`GOOG`MSFT, (1 2 3, 4 5 6, 7 8 9)); x; MSFT->[7,8,9] IBM->[1,2,3] GOOG->[4,5,6] x[`IBM`MSFT]; ([1,2,3],[7,8,9]) x[`IBM`MSFT,1 2]; ([2,3],[8,9])
也可使用函数 find 来获得某个键对应的值。
find(z,1 3); [8.8,4.2] z find 5; 6.4 find(z, 7 3); [,4.2] //7不是z中的键,因此返回NULL。
修改字典
我们可以用语句Z[X]=Y来更新或追加一个字典。如果键存在于字典中,那么该语句会更新对应的值;否则它会向字典Z添加一个新的键值对。另一个更新字典的方法是 dictUpdate! 函数。
// 更新字典z z[1]=9.2 z[3 5]=4.3 6.5 z; 9->5.3 5->6.5 1->9.2 6->3.7 3->4.3 // 增加新的键值到字典z z[2]=5 z; 2->5 9->5.3 5->6.5 1->9.2 6->3.7 3->4.3 // 下面这条语句执行失败,是因为z.2只有只读权限访问键2的值。 z.2=5; Syntax Error: [line #1] Please use '==' rather than '=' as equal operator in non-sql expression. x=dict(1 2 3, 1 1 1); x; 3->1 1->1 2->1 // 用函数dictUpdate!更新字典 dictUpdate!(x, add, 2 3, 1 2); 3->3 1->1 2->2 x.dictUpdate!(mul, 3 4, 2 4); 4->4 3->6 1->1 2->2
函数 erase! 用于删除一个键值;函数 clear! 用于清空所有键值。
x=1..3 y=4..6 z=dict(x,y); z; 3->6 1->4 2->5 z.erase!(3); 1->4 2->5 z.clear!(); z;
有序字典支持和等长的数组进行二元操作。输出一个字典,键不变,值为原字典值与数组进行二元操作后的结果。
x=`a `d `c `b; y=2.3 4.6 5.3 6.1; z1=dict(x, y,true); z2= 1 1 1 1 z1+z2; # output a->3.3 d->5.6 c->6.3 b->7.1
检索字典
用函数 in 在字典里检索某个键值。
x=1..3 y=4..6 z=dict(x,y); 1 in z; 1 10 in z; 0
关于性能
-
整数键值性能最佳。
-
基于向量的操作有利于发挥字典的性能,例如用一个向量访问一个字典。
-
取得所有的键值需要扫描整个字典。