set集合原理
-
set集合求差集是通过调用对象__hash__方法和__eq__方法(==运算)判断两个对象是否相同
-
set求差集时候使用的是初始化时候(元素添加到set集合的时候)计算出的hash值,即使初始化后修改了元素,也不影响求差集的结果
-
正常情况下list没有__hash__方法,也就是不可hash的(unhashable),自定义对象也一样。但我们可以在需要时自定义__hash__方法,这样就能获取到对象的hash值了
class my_list(list): # 自定义列表,继承list def __hash__(self): return hash(str(self)) def __eq__(self, other): return True if __name__ == '__main__': arr = [1, 2, 4] arr2 = [2, 3, 4] # s = {arr, arr2} # print(s) # 报错:TypeError: unhashable type: 'list'。因为构造set的时候需要元素的hash值,list没有hash方法 s = {my_list(arr), my_list(arr2)} print("s初始化后:", s) # 执行正常,my_list重写了__hash__方法,因此可以获取到hash值 s3 = {my_list([1, 2, 4])} print("s3", s3) print("s、s3求差集", s - s3) for item in s: # 遍历修改set中的列表元素,并修改 item.clear() item.append(1) print("s修改元素后:", s) s2 = {my_list([1])} print('s2', s2) s_s2 = s - s2 # set求差集时候使用的是初始化时候(元素添加到set集合的时候)计算出的hash值,即使初始化后修改了元素,也不影响求差集的结果 print("s、s2求差集", s_s2) print("s、s3求差集", s - s3)
执行结果:
s初始化后: {[2, 3, 4], [1, 2, 4]} s3 {[1, 2, 4]} s、s3求差集 {[2, 3, 4]} s2 {[1]} s、s2求差集 {[1], [1]} s、s3求差集 {[1]}
分类:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构