设置对象丢弃键的交集

时间:2016-06-28 18:27:56

标签: python set

我正在尝试使用此对象执行一些设置操作。

def Group(object):
  def __init__(self, name, email, description, skip_if_deleted, membership=None)
    self.name = name
    self.email = remove_special_characters(email.lower(), bad_chars)
    self.description = description
    self.action = None
    self.skip_if_deleted = skip_if_deleted
    if membership is not None:
      self.membership = set(membership)
    else:
      self.membership = set([])

  def __hash__(self):
    return hash(self.email)

  def __eq__(self, other):
    return self.email == other.email

我发现在做集合交叉时,我似乎正在丢弃填充的密钥'membership',以换取空的。

一个例子:

从第一个来源获取,在获取时不提供成员资格信息

# Example obj in unpopulated_membership looks like: Group(name, email, description, membership = empty set)
unpopulated_membership = set(get_groups_from_first_source())

从第二个来源获取,它确实返回成员资格信息

# Example obj in populated_membershop looks like: Group(name, email, description, membership = populated set)
populated_membership = set(get_groups_from_other_source())

common_groups = populated_membership.intersection(unpopulated_membership) 

现在,在这一点上,常见的组给出了两组之间的共性,但关键的“成员资格”现在等于unpopulated_membership's值。无论我是做populated_membership.intersection()还是unpopulated_membership.intersection()

这是为什么?如何在执行此交叉时保留populated_membership中的成员身份信息?

谢谢!

1 个答案:

答案 0 :(得分:1)

快速解决方法是使用集合理解:

common_groups = {group for group in populated_membership
                       if group in unpopulated_membership}

我建议您选择不同的方式来表示您的数据。例如,使用dicts将电子邮件地址与与其关联的信息进行匹配。您已经以这样的方式定义了Group.__hash__Group.__eq__"等于"小组持有不同的数据,这是非常不寻常的。

另外,如果这是Python 2,请不要忘记定义__ne__。您还应该定义__eq____ne__,使其返回NotImplemented而不是在另一个对象不是组时抛出AttributeError