---
source_url: https://docs.dolphindb.cn/zh/progr/data_types_forms/Dictionary.html
fetched_at: 2026-05-19T09:00:44Z
category: progr
title: 字典
sha1: 8fe94d00d562ba57fe725f58237b5a6c2478eea3
---

# 字典

## 概述

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

- 键必须是标量。键支持的数据类型为Integral类（compressed除外）、Temporal类、Floating类和Literal类。值可以是任何数据形式与数据类型。
- 键可以增加，但不可更新；值可以更新。

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

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

| 函数类型 | | 无序字典 | 有序字典 |
| --- | --- | --- | --- |
| 单目函数 | 标量函数 | 支持 | 支持 |
| 向量函数（常规及 cum/m 系列） | 支持 | 支持 |
| 聚合函数 | 支持 | 支持 |
| 双目函数 | 标量函数 | 支持，另一个参数只能是字典或标量 | 支持 |
| 向量函数（常规及 cum/m 系列） | 支持，另一个参数只能是字典或标量 | 支持 |
| 聚合函数 | 支持 | 支持 |

- 对于非向量函数，始终按行操作字典：即将把每个 key 对应位置的元素组成一行，再逐行应用函数。
- 对于向量函数，可以按行或按列操作字典，其行为由配置项 *processVectorFunctionOverTupleByRow* 控制：

  - true（默认）：按行操作，即将把每个 key 对应位置的元素组成一行，再逐行应用函数。
  - false：按列操作，即将每个 value 向量视为一列，函数分别作用于各列。

## 创建字典

用函数 [dict](../../funcs/d/dict.html) 或 [syncDict](../../funcs/s/syncDict.html) 创建一个字典，其中X表示键，Y表示值，参数 *ordered*
控制是否创建有序字典。*dict* 函数创建的字典不允许并发读写，*syncDict* 函数创建的字典允许并发读写。

```dolphindb
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
//创建有序字典，键的输出顺序与输入顺序一致
```

也可用指定数据类型的键和值来创建空字典，然后在字典中插入(键, 值)数据对。

```dolphindb
// 创建一个空字典，其键类型是整数，值类型是双精度浮点。
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](../../funcs/d/dict.html) (string, any)来创建一个值为不同数据类型的字典。

```dolphindb
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]
```

## 访问字典

```dolphindb
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](../../funcs/f/find.html) 来获得某个键对应的值。

```dolphindb
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!](../../funcs/d/dictUpdate_.html) 函数。

```dolphindb
// 更新字典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!](../../funcs/e/erase_.html) 用于删除一个键值；函数 [clear!](../../funcs/c/clear_.html) 用于清空所有键值。

```dolphindb
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;
```

有序字典支持和等长的数组进行二元操作。输出一个字典，键不变，值为原字典值与数组进行二元操作后的结果。

```dolphindb
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](../../funcs/i/in.html) 在字典里检索某个键值。

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

1 in z;

1

10 in z;

0
```

## 字典到表的转换方法

### 将一个字典转置为表

通过 `transpose` 函数可以将字典转置为表，更多转换规则请参考[函数页面](../../funcs/t/transpose.html)。

将简单字典转置为表：

```dolphindb
d=dict(`sym`val,[`a`b`c,1 2 3]);
d;
/*
val->[1,2,3]
sym->[a,b,c]
*/
transpose(d);
```

| val | sym |
| --- | --- |
| 1 | a |
| 2 | b |
| 3 | c |

将嵌套字典转置为表：

```dolphindb
d = {'tag1':{'val1':2,'val2':6},'tag2':{'val2':1, 'val3':3}}
d
/*
tag1->
    val1->2
    val2->6

tag2->
    val2->1
    val3->3
*/
transpose(d)
```

| key | val1 | val2 |
| --- | --- | --- |
| tag1 | 2 | 6 |
| tag2 |  | 1 |

### 将多个字典合并为表

高阶函数 [each](../../funcs/ho_funcs/each.html) 结合函数 [asis](../../funcs/a/asIs.html) 可以将多个字典合并为表。

合并后的表结构由第一个字典确定，表的列名对应该字典的键，每行的数据来自于字典中该键对应的值。如果某个字典中缺少某个键，表中该位置的值将为 NULL。

下例中，合并后的表由 d1 的键 key1、key2、key3、key4 构成；d2 中不包含 key1，故合并后的表对应值为 NULL。

```dolphindb
d1 = {'key1':10,'key2':"A1",'key3':0.15,'key4':[1,2,3]}
d1
/*
key1->10
key2->A1
key3->0.15
key4->[1,2,3]
*/

d2 = {'key2':"B1",'key3':0.16,'key4':[2,4,6,8],'key5':12}
d2
/*
key2->B1
key3->0.16
key4->[2,4,6,8]
key5->12
*/

asis:E([d1,d2])
```

| key1 | key2 | key3 | key4 |
| --- | --- | --- | --- |
| 10 | A1 | 0.15 | [1, 2, 3] |
|  | B1 | 0.16 | [2, 4, 6, 8] |

## 关于性能

- 整数键值性能最佳。
- 基于向量的操作有利于发挥字典的性能，例如用一个向量访问一个字典。
- 取得所有的键值需要扫描整个字典。
