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

news2024/11/19 15:39:27

目录

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算法来计算字符串和整数的哈希值 ,这是一种高效的非加密散列函数,具有良好的随机性和抗碰撞能力。

深入代码细节:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习论文: VanillaNet: the Power of Minimalism in Deep Learning

深度学习论文: VanillaNet: the Power of Minimalism in Deep Learning VanillaNet: the Power of Minimalism in Deep Learning PDF:https://arxiv.org/pdf/2305.12972 PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 提出的VanillaNet通过简化设计&…

【机器学习】Python sorted 函数

目录: 什么是sorted()函数列表降序排序应用到字符串自定义排序规则实际应用 Python中的内置函数——sorted()。 1. 什么是sorted()函数 在Python中,sorted()是一个内置函数,用于对任何可迭代对象(如列表、元组、字符串等&…

绿联NAS进入SSH的方法

1. 进入【设备管理】,在调试功能中,开启远程调试功能,发送手机验证码,你将得到一个3天有效期的验证码,就是ssh登录密码。 2. 使用终端工具或ssh命令直接登录SSH。 端口是922,账号是:root&#…

七月论文审稿GPT第5版:拿我司七月的早期paper-7方面review数据集微调LLama 3

前言 llama 3出来后,为了通过paper-review的数据集微调3,有以下各种方式 不用任何框架 工具 技术,直接微调原生的llama 3,毕竟也有8k长度了 效果不期望有多高,纯作为baseline通过PI,把llama 3的8K长度扩展…

李沐深度学习知识点—数值稳定性、模型激活函数、全连接层到卷积、卷积层

数值稳定性 其中h是一个向量,向量关于向量的倒数是一个矩阵,因此求梯度是求矩阵乘法 矩阵乘法带来了 梯度爆炸,梯度消失 模型初始化和激活函数 归一化:不管梯度多大,我都把梯度拉回来,否的出现梯度爆炸和梯…

【基础篇】第4章 Elasticsearch 查询与过滤

在Elasticsearch的世界里,高效地从海量数据中检索出所需信息是其核心价值所在。本章将深入解析查询与过滤的机制,从基础查询到复合查询,再到全文搜索与分析器的定制,为你揭开数据检索的神秘面纱。 4.1 基本查询 4.1.1 Match查询…

内容个性化的智能引擎:Kompas.ai如何满足用户需求

在数字化时代,用户对内容的消费趋向个性化和定制化。个性化内容不仅能提升用户体验,还能增强品牌与用户之间的互动。Kompas.ai作为一款先进的智能引擎,正通过其独特的技术满足用户的个性化需求。 个性化内容的重要性 个性化内容在提升用户体验…

2024 vue3入门教程:01vscode终端命令创建第一个vue项目

参考vue官网手册:https://cn.vuejs.org/guide/quick-start.html 一、找个盘符,新建文件夹存储以后得vue项目 我的是e盘下创建了vueproject 二、使用vscode打开存储vue项目的文件夹 因为我生成过项目,所以有文件,你们初次是没有…

分布式存储和分布式计算两个哪个更适合作为工作深入方向发展?

有朋友问,分布式存储比如hdfs,ceph,minio,tidb,glusterfs;分布式计算比如Hadoop,spark,flink;它们在实际工作中咋样?具体开发工作是啥?哪个更有发…

leetCode.96. 不同的二叉搜索树

leetCode.96. 不同的二叉搜索树 题目思路 代码 // 方法一:直接用卡特兰数就行 // 方法二:递归方法 class Solution { public:int numTrees(int n) {// 这里把 i当成整个结点,j当成左子树最左侧结点,并一次当根节点尝试// f[ i ] f[ j - 1…

《昇思25天学习打卡营第19天 | 昇思MindSporeDiffusion扩散模型》

19天 本节学了Diffusion扩散模型相关知识,并且通过实例完成扩散模型。Diffusion是从纯噪声开始通过一个神经网络学习逐步去噪,最终得到一个实际图像。 1.Diffusion对于图像的处理包括以下两个过程: 1.1我们选择的固定(或预定义&…

Is ChatGPT a Good Personality Recognizer? A Preliminary Study?

ChatGPT是一个很好的人格识别者吗?初步调研 摘要1 介绍2 背景和相关工作3 实验3.1 数据集3.2 提示策略3.3 基线3.4 评估指标3.5 实现细节3.6 Overall Performance (RQ1)3.7 ChatGPT在人格识别上的公平性 (RQ2)3.8 ChatGPT对下游任务的人格识别能力(RQ3&a…

python-求s=a+aa+aaa+aaaa+aa...a的值(赛氪OJ)

[题目描述] 求 saaaaaaaaaaaa...a 的值,其中 a 是一个一位的整数。 例如 :2222222222222222(此时共有 5 个数相加)。输入格式: 整数 a 和 n ( n 个数相加)。输出格式: s 的值。样例输入 2 2样例输出 24数据…

操作系统精选题(四)(论述题)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀操作系统 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 一、银行家算法的一道例题 二、页…

Stateflow快速入门系列(七): 使用时序逻辑调度图动作

要定义 Stateflow 图在仿真时间的行为,请在图的状态和转移动作中包含时序逻辑运算符。时序逻辑运算符是内置函数,告知状态保持激活的时间长度或布尔条件保持为 true 的时间长度。使用时序逻辑,您可以控制以下各项的时序: 各状态之…

守护矿山安全生产:AI视频分析技术在煤矿领域的应用

随着人工智能(AI)技术的快速发展,其在煤矿行业的应用也日益广泛。AI视频智能分析技术作为其中的重要分支,为煤矿的安全生产、过程监测、效率提升和监管决策等提供了有力支持。 一、煤矿AI视频智能分析技术的概述 视频智慧煤矿AI…

[数据库]mysql用户管理权限管理

目录 ​编辑用户管理​编辑 权限管理 ​编辑 ​编辑 ​编辑案例​编辑 细节 ​编辑 用户管理 我们用创建的用户在登录之后可以看到他和root看到的数据库是完全不一样的 权限管理 案例 登录这个账户可以看到还看不到teatdb这个数据库, 因为还没有授权 分配权限 过来刷新…

OpenCV 张正友标定法(二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在之前的博客OpenCV 张氏标定法中,我们没有考虑镜头畸变等因素,因此计算出的内参与外参均是理想情况下的数值,而如果我们考虑到镜头的畸变: 我们就需要考虑使用最小二乘法最小化像素坐标的重投影误差(上述所求…

007-GeoGebra基础篇-构建等边三角形

今天继续来一篇尺规作图,可以跟着操作一波,刚开始我写的比较细一点,每步都有截图,后续内容逐渐复杂后我就只放置算式咯。 目录 一、先看看一下最终效果二、本次涉及的内容三、开始尺规画图1. 绘制定点A和B2. 绘制线段AB3. 以点A为…

基于STM32的智能电池管理系统

目录 引言环境准备智能电池管理系统基础代码实现:实现智能电池管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:电池管理与优化问题解决方案与优化收尾与总结 1. 引言 智能电池管理系统(Ba…