Python 中的哈希集和哈希表

存储和检索数据的方式有很多种。假设您想要存储与板球比赛相关的数据。一种方法是为每个属性及其值创建一个列表列表,如下所示:

cricketData = [['Name', 'Anthony'], ['Runs', 46], ['Wickets', 2], ['Wides', 3]]
print(cricketData)

输出:

[['Name', 'Anthony'], ['Runs', 46], ['Wickets', 2], ['Wides', 3]]

这里,数据存储在连续的内存位置中,如图所示:

在此表示中,可以使用 for 循环检索数据。如果您想知道得分了多少次,可以编写一个简单的 for 循环,如下所示:

for ele in cricketData:
    if ele[0]=='Runs':
        print(ele[1])

输出:

 

这是一个耗时的过程,尤其是当数据集很大时。更好的方法是将数据转换为键值对格式。


在 Python 中使用哈希表

有时,我们需要的不是顺序数据存储结构,而是将数据映射到其对应的信息。这称为映射数据结构。

最流行和最重要的数据表示形式之一是哈希表。 

哈希,也称为哈希映射,以键值对的形式存储信息每个密钥都是唯一的,并用作识别与其关联的数据的参考。这就是哈希表被用作查找数据结构的原因。哈希表提供对存储在其中的键值对的快速插入和访问。

键被映射到值并使用哈希函数存储在内存中。任何大小的数据都可以使用哈希算法映射到固定大小的值。哈希函数可以是任何函数,如 mod (%)、plus(+) 或根据需要的任何自定义函数。

哈希表是使用称为字典的内置数据类型在 Python 中实现的。Dictionary是哈希表的 Python 特定实现。让我们看看如何使用 Python 对哈希表执行不同的操作。

使用字典在 Python 中创建哈希表

您可以使用大括号{}dict()关键字在 Python 中创建字典。

cricket = {'Name': 'Anthony', 'Runs': 46, 'Wickets': 2, 'Wides': 3}
print(cricket)
print(type(cricket))
{'Name': 'Anthony', 'Runs': 46, 'Wickets': 2, 'Wides': 3}
<class 'dict'>

现在我们已经创建了一个哈希表,我们可以访问其中存储的数据。

访问哈希表内的数据

字典允许您使用其键名称来访问项目。

print(cricket['Name'], "scored", cricket['Runs'], "runs and took", cricket['Wickets'], "wickets")
Anthony scored 46 runs and took 2 wickets

您还可以使用该get()方法来获取特定键的值。

print(cricket.get('Runs'))
 

keys()您可以分别使用和函数仅获取键和值values()

print(cricket.keys())
dict_keys(['Name', 'Runs', 'Wickets', 'Wides'])
print(cricket.values())
dict_values(['Anthony', 46, 2, 3])

更新哈希表中的值

由于字典是可变的,我们可以根据需要更改其中键的值。
如果你想将得分更改为 58,你可以这样写:

cricket['Runs'] = 58
print(cricket['Name'], "scored", cricket['Runs'], "runs")
Anthony scored 58 runs

添加更多键值对:

cricket['No Balls'] = 2
cricket['Players'] = 11
print(cricket)
{'Name': 'Anthony', 'Runs': 58, 'Wickets': 2, 'Wides': 3, 'No Balls': 2, 'Players': 11}

在 Python 中删除哈希表中的值

有许多函数可以让您从字典中删除值。

del():从给定键的字典中删除键值对。

del cricket['Wides']
print(cricket)
{'Name': 'Anthony', 'Runs': 58, 'Wickets': 2, 'No Balls': 2, 'Players': 11}

pop() :与del类似,删除给定键的键值对。

cricket.pop('Wickets')
print(cricket)
{'Name': 'Anthony', 'Runs': 58, 'No Balls': 2, 'Players': 11}

popitem():此函数从哈希表中删除最后插入的项目。

cricket.popitem()
print(cricket)
{'Name': 'Anthony', 'Runs': 58, 'No Balls': 2}

在 Python 中使用 HashSet

与哈希表类似,哈希集也是对象的集合。在哈希表中,数据以键值对的形式存储,而在哈希集中,数据以对象的形式存储。哈希集内部使用哈希表数据结构来存储数据项。就像集合一样,哈希集也不允许存储重复元素。

在Python中,哈希集的实现是通过使用集合本身来完成的。您可以使用Python对哈希集进行插入、更新、删除等操作。

使用 Python set 创建哈希集

您可以使用{}set()构造函数来创建集合。

colours = {'red', 'green', 'pink', 'blue'}
print(colours)
{'green', 'blue', 'red', 'pink'}

或者,

coloursList = ['red', 'green', 'pink', 'blue']
coloursSet = set(colours)
print(coloursSet)
{'green', 'blue', 'red', 'pink'}

访问集合中的元素

您可以使用关键字将元素归属于集合in这是一种 Pythonic 的做法。

if 'pink' in colours:
    print('Pink is present in the set')
else:
    print('Pink not found in the set')
Pink is present in the set

集合中的所有元素都可以打印如下:

for c in colours:
    print(c)
green
blue
red
pink

更新哈希集

由于集合中的值不能,因此只能使用各种函数向集合添加新元素。

add():使用此函数,您可以向集合中添加一个新项目。

print(colours)
colours.add('yellow')
print(colours)
{'green', 'blue', 'red', 'pink'}
{'yellow', 'pink', 'blue', 'green', 'red'}

update():从任何可迭代对象列表、元组等添加元素。您还可以使用此函数将另一个集合中的元素添加到当前集合中。

numbers = [2, 5, 4]
print(colours)
colours.update(numbers)
print(colours)
{'yellow', 'pink', 'blue', 'green', 'red'}
{2, 4, 5, 'yellow', 'pink', 'blue', 'green', 'red'}

从哈希集中删除元素

remove() 和discard():这两个函数从集合中删除提到的元素。

colours.remove(4)
print(colours)
 
colours.discard('red')
print(colours)
{2, 5, 'yellow', 'pink', 'blue', 'green', 'red'}
{2, 5, 'yellow', 'pink', 'blue', 'green'}

pop():此方法从集合中删除任何随机元素并返回它。

colours.pop()
print(colours)
  • clear():它完全清空集合。
  • del():该函数将删除集合。
colours.clear()
print(colours)
set()

结论

综上所述,哈希表和哈希集分别是用于以键值对和对象形式存储数据的数据结构。与哈希表中的两个元素相比,哈希函数仅适用于哈希集中的一个元素。在使用方面,当任务是检查元素是否存在时,我们使用 Set 实现。代码更简单,更容易掌握。当任务需要存储元素数据或需要基于键的更快搜索操作时,我们采用 Map 实现。


参考