我正在尝试使用此对象执行一些设置操作。
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
中的成员身份信息?
谢谢!
答案 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
。