📜  Python的哈希映射(1)

📅  最后修改于: 2023-12-03 15:19:34.540000             🧑  作者: Mango

Python的哈希映射

哈希映射是计算机科学中常用的一种数据结构,它提供了一种快速查找和插入数据的方法。Python 中的哈希映射就是字典。

字典概述

Python 中的字典是一种可变的、无序的、键值对 (key-value pairs) 的集合。它通过哈希表 (hash table) 实现,因此具有快速查找和插入的能力。

创建字典

可以使用花括号 {} 或者 dict() 函数来创建一个字典。字典中的元素以键值对的形式出现,键和值之间使用冒号 (:) 分隔,每个键值对之间使用逗号 (,) 分隔。

示例代码:

# 使用花括号创建字典
person = {'name': 'Bob', 'age': 20, 'gender': 'M'}

# 使用 dict() 函数创建字典
person = dict(name='Bob', age=20, gender='M')
字典操作

访问字典中的元素

可以使用字典名和键来访问字典中的元素。如果键不存在,会抛出 KeyError 异常。

示例代码:

person = {'name': 'Bob', 'age': 20, 'gender': 'M'}

print(person['name'])    # 输出 Bob
print(person['height'])  # 抛出 KeyError 异常

修改字典中的元素

访问字典中的键值对直接赋值即可修改元素的值。

示例代码:

person = {'name': 'Bob', 'age': 20, 'gender': 'M'}

person['age'] = 21  # 将年龄修改为 21
print(person)       # 输出 {'name': 'Bob', 'age': 21, 'gender': 'M'}

添加字典中的元素

可以使用字典名和键来添加元素。如果键已经存在,会将原有的值覆盖掉。

示例代码:

person = {'name': 'Bob', 'age': 20}

person['gender'] = 'M'     # 添加 gender 键值对
person['height'] = 175     # 添加 height 键值对
person['age'] = 21         # 将年龄修改为 21
print(person)              # 输出 {'name': 'Bob', 'age': 21, 'gender': 'M', 'height': 175}

删除字典中的元素

可以使用 del 关键字来删除字典中的键值对。

示例代码:

person = {'name': 'Bob', 'age': 20, 'gender': 'M'}

del person['gender']  # 删除 gender 键值对
print(person)         # 输出 {'name': 'Bob', 'age': 20}
字典遍历

可以使用 for 循环来遍历字典中的元素。默认情况下,for 循环遍历的是字典的键。

示例代码:

person = {'name': 'Bob', 'age': 20, 'gender': 'M'}

for key in person:
    print(key, person[key])

输出:

name Bob
age 20
gender M

如果需要遍历字典的值,可以使用 values() 方法。

示例代码:

person = {'name': 'Bob', 'age': 20, 'gender': 'M'}

for value in person.values():
    print(value)

输出:

Bob
20
M

如果需要遍历字典的键值对,可以使用 items() 方法。

示例代码:

person = {'name': 'Bob', 'age': 20, 'gender': 'M'}

for key, value in person.items():
    print(key, value)

输出:

name Bob
age 20
gender M
哈希冲突

哈希映射的底层实现是哈希表。哈希表就是数组和链表的混合体。在 Python 中,哈希表底层的实现是通过数组和链表的方式来存储数据。

在哈希表中,数据存储的位置是通过哈希函数计算出来的,而哈希函数的输出值就是数据在数组中的索引。但是,由于数组的长度是有限的,因此可能会出现两个数据需要存储在同一个位置的情况,这就是哈希冲突。

哈希冲突会导致数据存储位置的重复,从而影响查找和插入的效率。为了解决哈希冲突,哈希表使用了链表来进行处理。如果两个数据哈希到了同一个位置,那么这两个数据将被存储在同一个位置的链表上。

哈希映射的性能

在理想情况下,哈希映射的时间复杂度是 O(1)。也就是说,它的查找、插入和删除操作都是常数时间。但是,在最坏情况下,哈希映射的时间复杂度会退化到 O(n),即退化为链表。

在 Python 中,哈希映射的时间复杂度可以通过维护合理的装填因子(load factor)和扩容机制来保持稳定。装填因子是指哈希表中已有元素个数与哈希表长度的比值,扩容机制是指当装填因子达到一定阈值时,会重新分配更大的哈希表。

总结

Python 中的哈希映射就是字典,它提供了一种快速查找和插入数据的方法。哈希映射的底层实现是哈希表,哈希冲突的处理方法是使用链表。通过维护合理的装填因子和扩容机制,可以保持哈希映射的稳定性能。