字典与集合

8.1.1 数据存储和检索

数据访问的基本方式是基于存储位置。

找到数据的存储位置,称为检索。

概述

数据检索牵涉两个方面,一是已存储的数据集合,二是用户检索时提供的信息。检索可以是确定特定数据是否存在于数据集中;也可以是找到与所提供信息相关的数据。后一方式中,用户提供的信息被看作检索码或关键码。关键码作为数据的一部分,存储在数据集里,这就是基于关键码的数据存储和检索。

作为检索基础的关键码,通常是数据项的某种(可能具有唯一性)特征,可以是数据内容的一个组成部分;也可以是专门为数据检索建立的标签,例如学生的学号。

下面的讨论都是基于这样的基本假设:需要存储的数据元素由两部分组成,一是与检索有关的关键码,二是与之关联的数据。

字典操作和效率

实际中使用的字典可以分为两类:

  1)静态字典:创建之后,字典内容和结构都不再变化,主要操作只有检索。

  2)动态字典:创建之后,字典内容或结果一直处于动态变动之中,除检索操作之外,还有数据项的插入和删除等。

在字典检索中,要么检索成功要么检索失败。有关检索效率的评价标准,通常考虑在一次完整检索过程中比较关键码的平均次数,即平均检索长度。

字典和索引

索引:从关键码到数据存储位置的映射。

8.1.2 字典实现的问题

字典抽象数据类型

各种字典中都不应该允许修改关键码。

字典元素:关联

基于基本假设,一个数据项包括关键码和数据两部分,可以看成一个二元组,称之为关联。

下面定义一个关联对象的类:

 1 class Assoc:
 2     def __init__(self, key, value):
 3         self.key = key
 4         self.value = value
 5     
 6     # python解释器遇到"<"就会去类里找该方法
 7     def __lt__(self, other):
 8         return self.key < other.key
 9 
10     def __le__(self, other):
11         return self.key <= other.key
12 
13     def __str__(self):
14         return 'Assoc({0},{1})'.format(self.key, self.value)

字典的实现

一个细节。字典插入有一个特殊情况:要求插入的关键码已经在字典里了。常见处理方式包括修改已有关键码对应的值,或者插入一个新数据项,或者报错。与之对应,执行删除操作时,可能未找到相应项,或者存在多个关键码相同的项。如何处理视需求而定。

下面采用较简单的方式:如果插入时遇到关键码相同的项,就修改对应值;如果删除时没找到相应项,就什么都不做。

猜你喜欢

转载自www.cnblogs.com/yangxiaoling/p/9843191.html