字典

概述

字典是一种容器类型,包含唯一的键值对列表。其中:

  • 键必须是标量。键支持的数据类型为Integral类(compress除外)、Temporal类、Floating类和Literal类。值可以是任何数据形式与数据类型。

  • 键可以增加,但不可更新;值可以更新。

字典分为无序字典与有序字典两种类型。无序字典在输出或进行遍历时,其键值对不保留输入时的顺序;有序字典在输出或进行遍历时,键值对的顺序与输入顺序保持一致。DolphinDB 内置函数所返回的字典一般为有序字典,如使用 transpose 对表转置后的输出、JSON 字符串解析输出、机器学习模型输出,以及各类统计信息输出的字典。

有序字典和无序字典对各类函数的支持情况:

字典类型

单目函数

双目函数

窗口函数

聚合函数

无序字典

支持

支持,另一个参数只能是字典或标量

不支持

不支持

有序字典

支持

支持

支持

不支持

创建字典

用函数 dictsyncDict 创建一个字典,其中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 `b `c `d;
$y=2.3 4.6 5.3 6.1;
$z=dict(x, y,true);
$x = 1 1 1 1

$z+x;
a->3.3
b->5.6
c->6.3
d->7.1

检索字典

用函数 in 在字典里检索某个键值。

$ x=1..3
$ y=4..6
$ z=dict(x,y);

$ 1 in z;
1

$ 10 in z;
0

关于性能

  • 整数键值性能最佳。

  • 基于向量的操作有利于发挥字典的性能,例如用一个向量访问一个字典。

  • 取得所有的键值需要扫描整个字典。