2016-06-28 3 views
0

このオブジェクトを使用していくつかのセット操作を実行しようとしています。オブジェクトドロップキーの交差を設定する

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 

私はセットの交差点を行うとき、私は空のと引き換えに、人口の多いキー「会員資格」を落としているように見えることを発見しています。

例:

フェッチ

# 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) 
を返さない第2のソースからのフェッチ時に会員情報を提供していない最初のソースからフェッチ

この時点で、一般的なグループは2つのセットの共通点を示していますが、キーのメンバーシップは現在unpopulated_membership's値。私がpopulated_membership.intersection()かunpopulated_membership.intersection()を行うかどうかに関わらず、

これはなぜですか?この交差点を実行する際には、どうすればpopulated_membershipにある会員情報を保持できますか?

ありがとうございます!

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

は、私も、あなたのデータを表現する別の方法を選択することをお勧めします:

+1

あなたが保持する 'email'を2つの' Group'オブジェクトのどちらに使っているか気にするならば、 'email'に基づいて' __hash__'と '__eq__'を定義するべきではありません。 – user2357112

+0

2番目の@ user2357112には、どちらが保持されているかを気にする場合は、 'set'を使用しないでください。それは、あなたがデータのマージ操作を捨てるよりももっと似ているように聞こえます。それは、いくつかのカスタムコードが必要になるでしょう。 – jpmc26

答えて

1

クイックフィックスは、設定された理解を用いることであろう。たとえば、dictsを使用して電子メールアドレスとそれに関連する情報を照合します。 Group.__hash__Group.__eq__を「等しい」グループに異なるデータが保持されるように定義しました。これは非常に珍しいことです。

また、これがPython 2の場合は、__ne__を定義することを忘れないでください。 __eq____ne__は、他のオブジェクトがグループでないときにAttributeErrorを投げるのではなく、NotImplementedを返すように定義する必要があります。