使用set()方法为对象去重的实现原理hash()方法和eq()方法

  • 使用set() 方法根据对象的不同属性进行去重
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43

    """
    使用set()方法为对象去重的实现原理
    """

    # 创建一个类, 用来创建生成对象
    class Employee(object):

    def __init__(self, name, age, sex):
    """
    对象有3个是属性, 同一个名字同一性别的对象为一个对象,根据名字和性别进行去重
    :param name: 名字
    :param age: 年龄
    :param sex: 性别
    """
    self.name = name
    self.age = age
    self.sex = sex

    # 存放对象的列表
    employee_list = []
    # 创建100个老王对象
    for i in range(200):
    employee_list.append(Employee('老王', i, '男'))

    # 创建100个老张对象
    for i in range(200):
    employee_list.append(Employee('老张', i, '女'))

    # 创建100个老刘对象
    for i in range(200):
    employee_list.append(Employee('老刘', i, '男'))

    # 使用set()方法去重
    print(set(employee_list))
    ex_set = set(employee_list)
    for ex in ex_set:
    print(ex.__dict__)

    ********************************************
    运行之后发现还是300个对象


    直接用set()方法去重,会发现,根本无法实现需求,set()方法是根据对象的hash算法吧相同对象的指向同一内存地址, 并判断值是否相等,所以要把对象的hash方法重写一下, 代码如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52

    """
    使用set()方法为对象去重的实现原理
    """

    # 创建一个类, 用来创建生成对象
    class Employee(object):

    def __init__(self, name, age, sex):
    """
    对象有3个是属性, 同一个名字同一性别的对象为一个对象,根据名字和性别进行去重
    :param name: 名字
    :param age: 年龄
    :param sex: 性别
    """
    self.name = name
    self.age = age
    self.sex = sex

    def __hash__(self):
    """
    因为每个对象继承object, 而object的里面都有一个__hash__方法,这里写相当于是重写object里面的__hash__(),方法
    """
    return hash('%s%s'%(self.name,self.sex))

    def __eq__(self, other):
    """
    判断值是否相同, 这个方法是在调用__hash__()方法之后进行判断
    """
    if self.name == other.name and self.sex == other.sex:
    return True


    # 存放对象的列表
    employee_list = []
    # 创建100个老王对象
    for i in range(200):
    employee_list.append(Employee('老王', i, '男'))

    # 创建100个老张对象
    for i in range(200):
    employee_list.append(Employee('老张', i, '女'))

    # 创建100个老刘对象
    for i in range(200):
    employee_list.append(Employee('老刘', i, '男'))

    print(set(employee_list))
    ex_set = set(employee_list)
    for ex in ex_set:
    print(ex.__dict__)

  • 这里已经实现set()进行去重,加油,不懂就问!!