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]}

 

posted @   foreast  阅读(263)  评论(0编辑  收藏  举报
编辑推荐:
· 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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示