字典简介

你好!欢迎来到数据结构基础中最实用的章节之一。到目前为止,你可能已经使用过数组 (Arrays)列表 (Lists),这些结构都是通过数字(索引)来寻找数据。但如果你想通过名称或标签来查找数据呢?这正是字典 (Dictionaries) 发挥作用的地方!

你可以把字典想像成手机里超级强大的联络人清单。你不需要记住朋友是“第 42 号联络人”来找他;你只需要输入他的名字。字典让搜索特定信息变得既快速又直观。让我们深入了解吧!

1. 什么是字典?

在计算机科学中,字典是一种抽象数据类型 (Abstract Data Type, ADT),它以键值对 (Key-Value Pairs) 的形式存储数据。

字典中的每一项数据都包含两个部分:
1. 键 (Key):这充当了唯一的识别码(就像实体字典中的单词,或是通讯录中某人的姓名)。
2. 值 (Value):这是与该键相关联的实际数据(就像单词的定义,或是该人的电话号码)。

键的黄金法则

在任何字典中,键 (Keys) 必须是唯一 (unique) 的。你不能拥有两个相同的键,因为计算机将无法判断该返回哪一个值!不过,值 (Values) 则不需要唯一——两个不同的键可以对应到同一个值。

快速复习:键 vs. 值
- 键 (Key):你用来查找数据的标签(必须唯一)。
- 值 (Value):系统返回给你的数据(可以是任何内容)。

重点总结

字典是一组键值对的集合,你可以通过相关联的来存取其对应的

2. 字典与数组的比较

如果这听起来有点抽象,别担心!让我们把它和你已经熟悉的数组 (Array) 比较一下。

数组中,“键”永远是整数索引 (integer index)(0, 1, 2...)。是由计算机决定位置。
字典中,“键”几乎可以是任何数据类型,例如字符串 (string)。由你(程序员)决定标签的内容。

示例:
数组: Names[0] = "Alice"
字典: Ages["Alice"] = 17

你知道吗?
在搜索特定项目时,字典通常比数组快得多。在一个庞大的数组中,你可能需要检查每一个格子才能找到“Alice”。而在字典中,你只需直接要求查找“Alice”,计算机就能精确地知道该值存储在哪里!

3. 现实应用

AQA 课程大纲特别提到信息检索 (Information Retrieval) 是字典的核心用途。一个经典的例子是统计文件中单词出现的次数。

步骤拆解:单词频率统计

想像我们有这样一个句子:"The green, green grass grows"。我们想要存储每个单词出现的次数。我们可以将其表示为一个字典:

1. "The":出现 1 次。
2. "green":出现 2 次。
3. "grass":出现 1 次。
4. "grows":出现 1 次。

以程序语言的符号表示如下:
{ 'the': 1, 'green': 2, 'grass': 1, 'grows': 1 }

重点总结

字典非常适合快速检索信息,例如查询定义、识别码 (ID) 或统计频率。

4. 以字典表示向量

在课程稍后,你会接触到向量 (Vectors)。课程大纲指出,当我们把向量视为一个函数 (function) 时,字典是用来表示向量的一种非常有用的方式。

对于像 \( [2.0, 3.14, -1.0] \) 这样的向量,我们可以将其视为一种映射,其中索引对应到一个值:
\( 0 \mapsto 2.0 \)
\( 1 \mapsto 3.14 \)
\( 2 \mapsto -1.0 \)

在字典中,这会是:{0: 2.0, 1: 3.14, 2: -1.0}。这对于“稀疏向量 (sparse vectors)”特别有效,因为大部分数值为零时,我们只需要存储那些确实有数据的键即可!

5. 常见操作

当你在程序项目中中使用字典时,通常会执行以下四项任务:

  • 新增 (Add) 一组新的键值对。
  • 删除 (Delete) 现有的键值对。
  • 修改 (Amend/Update) 现有键对应的值。
  • 查询 (Lookup) 键所对应的值。

避免常见错误:
尝试存取不存在的键!如果你要求字典返回 "Bob" 的值,但字典里并没有 "Bob",你的程序很可能会因为“键错误 (Key Error)”而崩溃。务必先检查该键是否存在!

记忆小帮手:钥匙圈
想像一个实体的钥匙圈。每一把钥匙 (Key) 都有独特的形状。当你使用那把钥匙时,它能打开一扇特定的门 (Value)。你可以把很多钥匙挂在圈上,但每一把都是独一无二的!

快速复习总结

它是什么? 一组键值对的集合。
有顺序吗? 从概念上讲,字典是无序的。我们关注的是关联性 (association),而不是序列。
键的规则: 键必须唯一;值不需要唯一。
主要用途: 快速信息检索及表示复杂的映射关系(如向量)。

最后的鼓励

如果你习惯了数组那种严格的“0, 1, 2”索引,字典一开始可能让你觉得有点陌生,但一旦你开始使用它,你会发现它让你的代码更易读、执行效率更高。在接下来的程序练习中多尝试使用它吧!