Python中可以hash的数据类型

来源:千锋教育
发布时间:2023-11-05 21:17:16
分享

在Python中,仅仅只有不可变数据类型可以被hash,然而每个自定义的对象在Python中都可以被hash,默认的他们的hash值是由他们的id派生的。也就意味着,同一个类的两个不同实例,默认的是得到不同的hash值

>>>classCar():

...velocity=0

...direction=0

...damage=0

...

>>>first_car=Car()

>>>second_car=Car()

>>>hash(first_car)

274643597

>>>hash(second_car)

274643604

哈希表

现在你知道了什么是哈希函数,现在可以检测哈希表,哈希表是一个数据结构可以储存一堆键值对。

在哈希表中,键值对的所有建必须是可以哈希的,因为存储的对是通过使用其键的散列索引的。哈希表十分有用,Hashtablesareveryusefulbecausetheaveragenumberofinstructionsthatarenecessarytolookupanelementofthetableisindependentofthenumberofelementsstoredinthetableitself.哈希表非常有用,因为查找表中某个元素所需的平均指令数量与表中存储的元素数量无关,这就表明了不管你的表增长到成百上千次,查找特定元素的速度不会受到影响。

哈希表通常是通过创建可变数量的存储桶来实现的,这些存储桶将包含您的数据,并通过哈希它们的键对这些数据进行索引。键的散列值将确定用于特定数据段的正确存储桶。

importpprint

classHashtable:

def__init__(self,elements):

self.bucket_size=len(elements)

self.buckets=[[]foriinrange(self.bucket_size)]

self._assign_buckets(elements)

def_assign_buckets(self,elements):

forkey,valueinelements:

hashed_value=hash(key)

index=hashed_value%self.bucket_size

self.buckets[index].append((key,value))

defget_value(self,input_key):

hashed_value=hash(input_key)

index=hashed_value%self.bucket_size

bucket=self.buckets[index]

forkey,valueinbucket:

ifkey==input_key:

return(value)

returnNone

def__str__(self):

returnpprint.pformat(self.buckets)#herepformatisusedtoreturnaprintablerepresentationoftheobject

if__name__=="__main__":

capitals=[

('France','Paris'),

('UnitedStates','WashingtonD.C.'),

('Italy','Rome'),

('Canada','Ottawa')

]

hashtable=Hashtable(capitals)

print(hashtable)

print(f"ThecapitalofItalyis{hashtable.get_value('Italy')}")

Moreover,themoreyouincreasethenumberofbucketsyouwillhandle,themorespaceyouwillwaste.Totestthisyoucansimplychangethebucketsizeofyourpreviousexampleusinganumberofbucketsthatistwotimesthelengthoftheinputlist:

此外,处理的桶数增加越多,浪费的空间就越多。要测试这一点,只需使用输入列表长度的两倍的桶数来更改上一个示例的桶大小

两个散列值发生碰撞,将会存储到同一个桶中,因为冲突不可避免,实现一个哈希表就得有一个解决冲突的方法。

通常在哈希表解决冲突的常用策略是:

openaddressing开放寻址法

separatechaining链地址法

连地址法是您在上面的示例中已经实现的,它由使用另一个数据结构在同一个bucket中创建一个值链组成。在那个示例中,您使用了一个嵌套列表,当在超额占用的bucket中查找特定值时,必须对该列表进行完全扫描。

在开放寻址策略中,如果您应该使用的bucket是忙碌的,那么您只需继续搜索要使用的新bucket。要实现这个解决方案,您需要对为新元素分配bucket的方式和检索键值的方式进行一些更改。从assignbuckets()函数开始,您必须使用默认值初始化您的bucket,并且如果您应该使用的bucket已经被占用,则继续寻找空的bucket

以上内容为大家介绍了Python中可以hash的数据类型,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • 七本经典python书籍 如果你想学习Python,市场上有许多可用的资源,本文我们为广大初学者们推荐7本最经典的Python书籍,这些书籍都非常受欢迎,你可以根据自己的需求选择:1.《Python编程:从入门到实践》这是一本
  • 用Python开发一个简单的猜数字游戏 本文介绍如何使用Python制作一个简单的猜数字游戏。游戏规则玩家将猜测一个数字。如果猜测是正确的,玩家赢。如果不正确,程序会提示玩家所猜的数字与实际数字相比是“大(high)”还是“小(low)”,
  • 使用 Python 函数进行模块化 你是否对函数、类、方法、库和模块等花哨的编程术语感到困惑?你是否在与变量作用域斗争?无论你是自学成才的还是经过正式培训的程序员,代码的模块化都会令人困惑。但是类和库鼓励模块化代码,因为模块化代码意味着
  • Python语言自带的数据结构有哪些 Python作为一种脚本语言,其要求强制缩进,使其易读、美观,它的数据类型可以实现自动转换,而不需要像C、Java那样给变量定义数据类型,使其编写非常方便简单,所以广受大家的欢迎。现如今,Python
  • 用Python和Conu测试容器 越来越多的开发人员使用容器开发和部署他们的应用。这意味着可以轻松地测试容器也变得很重要。Conu(containerutilities的简写)是一个Python库,让你编写容器测试变得简单。本文向你介
  • Python循环应该怎么写? 说到处理循环,我们习惯使用for,while等,比如依次打印每个列表中的字符:lis=['I','love','python']foriinlis:pr