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 @ 2021-04-15 10:01  foreast  阅读(254)  评论(0编辑  收藏  举报