Python对象不可哈希?教你几招解决!

目录

1、什么是可哈希?🚀

1.1 哈希基础理论

1.2 可哈希对象定义🔍

示例代码:

1.3 Python中哈希的作用

1.4 哈希表与性能提升📈

应用实例代码:

2、Python中的哈希特性🔑

2.1 不变性与哈希值🔄

示例代码展示:

2.2 实现细节深入探讨📚

深入代码细节:

3、创建可哈希类的技巧🛠️

3.1 使用__hash__方法🔨

示例代码:

3.2 遵循__eq__一致性🔗

一致性实践:

4、实战案例:字典与集合的应用例子📊

4.1 字典键的哈希需求🏷️

示例代码:

4.2 集合元素不可变性的重要性🌟

实战代码演示:

5、深入理解哈希冲突及解决办法🔗

5.1 哈希冲突是什么❓

5.2 解决哈希冲突的策略💡

线性探测示例代码:

链地址法示例代码:

6、实战:利用哈希解决实际问题 🔧

6.1 缓存机制中的哈希

6.2 数据去重策略

7、总结 & 进阶学习路径📚



1、什么是可哈希?🚀

1.1 哈希基础理论

哈希,或称为散列 ,在计算机科学中是一种将任意大小的数据映射到固定大小值的技术。这一过程通过哈希函数实现,它接收输入(或称“键”) ,并产生一个独一无二的输出(哈希值)。理想情况下,不同输入应得到不同输出,且哈希函数应当快速且计算简单。尽管现实中难以达到绝对唯一 ,但设计良好的哈希函数应尽量减少冲突。

1.2 可哈希对象定义🔍

在Python中,一个对象若想成为字典的键或者被放入集合中,它必须是可哈希的。这意味着该对象需要实现两个特殊方法:__hash__() 和 __eq__()__hash__() 方法用于计算对象的哈希值 ,而 __eq__() 方法用于比较两个对象是否相等。值得注意的是,如果两个对象通过 __eq__() 判断为相等,则它们的 __hash__() 方法必须返回相同的哈希值,以保持哈希表的一致性。

示例代码:
class SimpleHashable:
  def __init__(self, value):
        self.value = value

  def __hash__(self):
  returnhash(self.value)

  def __eq__(self, other):
    if  isinstance(other,SimpleHashable):
      return self.value == other.value
    return False

obj1 =SimpleHashable(100)
obj2 =SimpleHashable(100)

print(hash(obj1))# 输出与obj2相同的哈希值,因为它们内容相等
print(hash(obj2))

1.3 Python中哈希的作用

在Python中 ,哈希机制支撑了几个核心数据结构的高效运作,比如字典(dict)和集合(set)。具体来说:

  • • 字典: Python字典使用哈希表作为底层实现,使得查找、插入和删除操作能够达到接近常数时间复杂度O(1)。键(key)必须是可哈希的,这意味着它们需要是不可变的,因为一旦创建,其哈希值就不能改变,这样才能保证字典操作的高效与一致性。

  • • 集合: 类似于字典,集合也依赖哈希来快速确定成员关系和执行集合运算(如并集、交集)。由于集合元素要求唯一性,哈希机制确保了这种高效去重。

  • • 记忆化技术: 在算法优化中,哈希可以用于缓存先前计算的结果,加速递归或重复计算过程,这被称为记忆化。

下面通过代码示例展示可哈希对象在字典中的应用,并观察其行为:

# 示例代码:使用可哈希对象作为字典键
hashable_key =(1,2,3)# 元组是可哈希的 ,因为它是不可变的
my_dict ={hashable_key:"Hello, World!"}

# 尝试访问字典中的值
print(my_dict[(1,2,3)])# 输出: Hello, World!

# 注意:尝试使用可变对象如列表作为键会引发TypeError
mutable_key =[1,2,3]
# my_dict[mutable_key] = "Error"  # 这将导致错误 ,因为列表不是可哈希的

这段代码展示了如何利用一个元组(作为不可变序列,因此是可哈希的)作为字典的键,并成功访问到对应的值。同时,注释部分说明了如果尝试使用可变对象如列表作为键,Python将抛出TypeError ,这是因为这些对象无法提供稳定的哈希值 ,不符合字典键的要求。

1.4 哈希表与性能提升📈

哈希表是一种数据结构,它利用哈希函数将键直接映射到数组的一个索引上 ,从而实现了快速的查找、插入和删除操作。在Python中,字典就是一种哈希表的实现。当使用可哈希对象作为字典的键时,Python可以迅速定位到对应值的位置,平均时间复杂度接近O(1),极大地提高了程序的运行效率。

例如,处理大量数据去重时,使用集合(Set)这种基于哈希表的数据结构,相比传统循环判断的方式 ,能显著加速处理速度。这是因为集合内部通过哈希机制避免了不必要的遍历比较。

应用实例代码:
data = [1, 2, 2, 3, 4, 9, 1, 3, 4]
unique_data = set(data)
print(list(unique_data))  # 输出去重后的列表

通过上述探讨 ,我们明白了可哈希对象在Python中的重要性及其如何通过哈希表机制促进程序性能的提升。掌握这些基础原理,对于编写高效、可靠的Python代码至关重要。

2、Python中的哈希特性🔑

2.1 不变性与哈希值🔄

在Python中,哈希值的计算基于对象的状态。为了确保哈希表的正确性和高效性 ,一旦一个对象被哈希 ,它的状态就不能改变。这意味着,只有那些具有不变状态的对象才是可哈希的。例如,字符串、整数和元组等基本类型是可哈希的 ,而列表和字典等可变类型则不是。

示例代码展示:
s = "immutable"
print(hash(s))  # 输出s的哈希值

l = [1, 2, 3]
# print(hash(l))  # 尝试对列表求哈希值会导致TypeError

尝试对列表求哈希值会引发TypeError,因为列表是可变的,而可变对象的状态可能随时间变化,这会破坏哈希表的稳定性。因此,Python不允许对可变对象求哈希值。

2.2 实现细节深入探讨📚

Python中的哈希算法设计得非常精妙,旨在提高散列分布的质量,减少哈希冲突,同时保证计算效率。Python使用SipHash算法来计算字符串和整数的哈希值 ,这是一种高效的非加密散列函数,具有良好的随机性和抗碰撞能力。

深入代码细节:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/761337.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小区服务前台小程序的设计

管理员账户功能包括:系统首页,个人中心,住户管理,管理员管理,员工管理,安保管理,安保分配管理,客服聊天管理 微信端账号功能包括:系统首页,公告,…

【传知代码】揭秘AI如何揪出图片中的“李鬼”(论文复现)

在数字化时代,我们时常被各种图像信息所包围。然而,这些图像中有时隐藏着不为人知的秘密——被篡改的文字或图像。这些被篡改的内容可能误导我们的判断,甚至在某些情况下造成严重的后果。幸运的是,随着人工智能(AI&…

免费开源AI生产力工具:内置专属ChatGPT、一键智能处理图片和视频(擦除水印、卡通漫画、无损放大、插值补帧、智能修复、3D转制、上色修复、合成整理)

AI 生产力工具 免费开源,提升用户生产力,保障隐私和数据安全。提供高效便捷的AI解决方案,包括但不限于:内置专属ChatGPT、一键批量智能处理图片和视频等。 主要特点 免费开源:免费使用,源代码开放&#…

使用Nginx反向代理KKFileView遇到问题

使用KKFileView 4.0 以上版本 在KKFileView官网上,关于使用Nginx代理,建议配置如下 一、修改Nacos 在Nginx的conf文件夹中修改 nginx.conf ,新加 红框内的IP地址为代理服务器地址(即安装KKFileView的服务器地址) 二、修改KKFil…

逻辑这回事(七)---- 器件基础

Xilinx FPGA创建了先进的硅模块(ASMBL)架构,以实现FPGA具有针对不同应用程序领域优化的各种功能组合的平台。通过这一创新,Xilinx提供了更多的设备选择,使客户能够为其特定设计选择具有正确的功能和功能组合的FPGA。ASMBL体系结构通过以下方式突破了传统的设计障碍:消除几…

一个时代的结束:Centos7将在6月30日退出历史舞台

友情提醒: 如果你使用的是曾经辉煌一时的CentOS Linux 7,一直拖延没有迁移,那么现在距离它正式寿终正寝还有不到一周的时间。 CentOS Linux 7 的结束日期仍定在2024年6月30日。红帽早在 2020 年就做出了有争议的举动,将重点转移到…

前后端交互整合 - Wiki

集成 Http 库 axios 首先在前端工程中安装 axios ,切换为 wiki / web 目录下,安装命令行为 npm install axios --save 通过 axios 调用电子书列表接口: 定义 setup( ) 方法,页面被调用时便会执行此方法,在方法中要想使用 axios ,首先需要引入 axios 包: import axios f…

网络安全 文件上传漏洞-18 第十八关 Pass-18

点击进入第十八关,并选择显示代码: //index.php $is_upload false; $msg null; if (isset($_POST[submit])) {require_once("./myupload.php");$imgFileName time();$u new MyUpload($_FILES[upload_file][name], $_FILES[upload_file][tmp…

百日筑基第七天-JAVA开发IDEA调试技巧(常用按钮)

百日筑基第七天-JAVA开发IDEA调试技巧(常用按钮) 1.Show Execution Point 快捷键:Alt F10 回到当前激活的断点处;当你的鼠标不在断点所处的行,点击之后,会立马复位到断点处; 2.Step Ove 快…

你需要精益管理咨询公司的N+1个理由

近年来,精益管理作为一种被全球众多知名企业验证过的成功管理模式,越来越受到企业的青睐。但是,为何在实施精益管理的过程中,众多企业纷纷选择请咨询公司来协助呢?今天,我们就来一起揭秘这背后的原因。 1. …

go Channel原理 (三)

Channel 设计原理 不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。 在主流编程语言中,多个线程传递数据的方式一般都是共享内存。 Go 可以使用共享内存加互斥锁进行通信,同时也提供了一种不同的并发模型,即通…

使用热力图表示联邦学习场景中的客户端数据分布

用于生成热力图,记录过程,方便之后直接使用。 使用场景:联邦学习中显示客户端数据分布,或者显示数据分布的各类其他场景 文章目录 一、代码hot.py使用方法 二、参数解释三、样图关键词 一、代码 写这段代码时主要考虑联邦学习中显…

阿里云物联网应用层开发:第一部分,项目简介

文章目录 1、物联网应用层简介2、阿里云物联网应用层开发例程主要内容3、需要掌握基础知识 1、物联网应用层简介 应用层是物联网系统的用户界面,它提供了用户与系统交互的接口,这一层是将网络传输层的数据结果以易于理解和使用的方式呈现给用户&#xf…

在AvaotaA1全志T527开发板上使用 SSH 连接开发板

使用 SSH 连接开发板 启动系统 前提条件: 确保已经制作好AvaotaA1系统镜像至TF卡。 ​ 确保开发板电源供电正常:默认SPI显示屏有图案输出。 确保当前环境下有可以正常上网的路由器RJ45网线接口。 获取IP地址 如果想通过ssh去登陆开发板系统&#…

广义加性模型

简要介绍 在统计学中,广义加性模型(GAM)是一种广义线性模型,其中线性响应变量线性地依赖于一些预测变量的未知光滑函数,并且人们对这些光滑函数的推理很感兴趣。 GAM最初由Trevor Hastie和Robert Tibshirani[1]开发&…

数据写入流程,数据读取流程

理解客户端在HDFS上读、写数据的流程 数据写入流程 1. 客户端向NameNode发起请求 2. NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址 3. 客户端向指定的DataNode发送数据包 4. 被写入数据的DataNode同时完成数据副本的…

mysql岗位实习----教务系统管理

教务管理系统 一、DDL CREATE TABLE users (user_id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户ID,username varchar(50) NOT NULL COMMENT 用户名,password varchar(255) NOT NULL COMMENT 密码,gender enum(男,女) NOT NULL COMMENT 性别,email varchar(100) DEFAULT N…

绿色算力|暴雨发布浸没式液冷服务器

随着数字经济的飞速发展和AI创新应用的不断突破,算力规模持续增长,最新发布的《数字中国发展报告(2023年)》显示,2023年中国算力总规模达到230EFLOPS,居全球第二位。 服务器作为算力基础设施底座&#xff…

spring中集成mybatis,并测试是否成功

首先你要配置pom.xml <!-- 连接 MySQL 数据库的驱动程序 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- spring-jdbc -->&…

OSRAM欧司朗XBO短弧氙灯160WHSXLOFR短弧氙灯450W

OSRAM欧司朗XBO短弧氙灯160WHSXLOFR短弧氙灯450W