详解Python 字典、映射和散列表

  • Post category:Python

下面我来给你详细讲解Python中的字典、映射和散列表的使用方法。

1. Python字典(dictionary)

Python字典是一种无序的键值对的集合,用{}括起来。其中,每个键必须是唯一的,而值可以是任意的Python对象。字典是可变的,也就是说可以随意地添加、删除和修改其中的元素。

1.1 创建字典

创建一个字典,可以使用下面的代码:

# 空字典
d1 = {}

# 带初始值的字典
d2 = {'key1': 'value1', 'key2': 'value2'}

1.2 字典的基本操作

1.2.1 添加、删除、修改字典中的元素

# 添加元素
d2['new_key'] = 'new_value'

# 删除元素
del d2['key1']

# 修改元素
d2['key2'] = 'new_value2'

1.2.2 获取字典中的元素

使用以下方法来获取字典中的元素:

# 获取单个元素的值
value = d2['key2']

# 获取所有键的列表
keys = list(d2.keys())

# 获取所有值的列表
values = list(d2.values())

# 获取所有项的元组列表
items = list(d2.items())

1.2.3 判断字典中是否存在某个键或值

可以使用以下方法来判断是否存在:

# 判断是否存在某个键
'key2' in d2

# 判断是否存在某个值
'new_value2' in d2.values()

1.3 字典的遍历

遍历字典可以使用以下两种方式:

# 遍历所有键值对
for key, value in d2.items():
    print(key, value)

# 遍历所有键
for key in d2.keys():
    print(key)

# 遍历所有值
for value in d2.values():
    print(value)

2. Python映射(mapping)

Python的映射类型是指可建立键(key)与值(value)一一对应关系的数据类型。其中,字典就是一种映射,而集合(set)和frozenset也可以看作是特殊的映射。

在Python中,映射类型都有一个共同的特点,就是它们的键必须是不可变的类型,而值可以是任意类型。

2.1 创建并更新映射

创建映射的方式与创建字典类似,都是使用{}或者dict()方法。映射的更新也类似于字典,使用[ ]操作符来添加、修改或删除映射中的项。

# 创建映射
mapping1 = {'key1': 'value1', 'key2': 'value2'}
mapping2 = dict(key1='value11', key2='value22')

# 更新映射
mapping1['key3'] = 'value3'
del mapping1['key1']
mapping1['key2'] = 'new_value2'

2.2 映射的常用操作

映射支持的常规操作有:len()、in、del。另外,由于映射是可迭代对象,所以也支持迭代操作。

# 计算映射中键值对的个数
len(mapping1)

# 判断映射中是否存在某个键
'key2' in mapping1

# 删除映射中的某个键值对
del mapping1['key1']

# 迭代映射中的所有键值对
for k, v in mapping1.items():
    print(k, v)

3. Python散列表(hash)

Python中的内置类型,如字典、集合(set)和frozenset等使用的都是散列表(hash表)来实现数据的存储和查找。散列表是一种支持高效数据查找的数据结构,它的特点是可以快速地定位存储位置。

在Python中,散列表使用了哈希函数来计算键的存储位置。因此,Python中的哈希函数对于性能的影响非常大,通常情况下我们不需要过于关注它的实现。

3.1 散列表的特点

散列表的实现通过将每个键(key)都映射到一个存储位置(index)来实现快速查找,这就是散列表的核心所在。散列表的查找时间复杂度为O(1),也即可以实现常数级别的查找速度。

与列表(list)不同,散列表是无顺序的,因此它们不能在保持元素顺序的同时实现快速的查找。另外,散列表中的元素可以随时添加、删除或修改,所以它们也是可变的。

3.2 实现散列表的方式

在Python中,散列表的实现方式有多种。比较常见的方式是使用字典、集合和frozenset。

下面以字典为例,介绍如何使用字典来实现散列表。

# 创建一个字典
hash_table = {}

# 添加元素
hash_table['key1'] = 'value1'

# 判断某个键是否在字典中
if 'key1' in hash_table:
    print(hash_table['key1'])

3.3 示例

下面是一个使用散列表存储分数统计结果的例子。假设我们有一个学生成绩单,该学生数学(M)、英语(E)、物理(P)、化学(C)等科目的成绩分别为85、72、92和88。我们可以使用字典来存储并计算各科成绩的平均分。

# 构造成绩单
scores = {'M': 85, 'E': 72, 'P': 92, 'C': 88}

# 计算平均分
avg_score = sum(scores.values()) / len(scores)

# 输出结果
print('平均分:', avg_score)

输出结果为:

平均分: 84.25

在这个例子里,我们使用了字典来存储每个科目的成绩,然后通过sum、len等函数来计算平均分。由于散列表的查找速度很快,因此这个计算过程非常高效。