2016-12-09 4 views
2

私はSetにIPアドレスを格納しています。 IPアドレスは一意のIPまたはサブネットにすることができます。私は__hash____eq__メソッドをオーバーロードしました。 Setは正常に動作します。複製が追加されたときに元の要素を取得

質問:重複要素を追加しようとしているとき、元の要素を表示する方法はありますか?

inの操作は使用できません。これは、IPアドレスが約100,000であり、Setの5つの異なるバケットのようにしか作成できないため、時間がかかるためです。

IはSetサブネット10.0.0.0/8を加えました。

次に、ユニークなIP 10.10.10.10をSetに追加しようとしました。

Setは、サブセット10.0.0.0/8の複製であるため、固有のIPを追加しません。 10.0.0.0/8

P.Sの

10.10.10.10が重複:私はちょうどin操作の定義を経て、このような状況で、私は、ユーザーを表示したいです。要素が既に存在するかどうかを示します。元の要素は表示されません。 (私はPython開発者ではない)。

P.P.S:ファイアウォールのACLリストを読んでいます。私はセットにIPアドレスを追加するだけではありません。だから私はここにコードを表示することはできません。コードは機能します。

+0

スニペットを追加できますか? –

+0

コードスニペットを追加しなかったのは、大きなコードとコードがファイルを1行ずつ読み込み、各行にたくさんのものを入れ、IPアドレスを取得してからセットに追加するからです - 'ip_address_set.add (each_ip) ' –

+0

少なくとも' __eq__'メソッド? –

答えて

1

IPアドレスセットと、セットに追加するアイテムだけを含む新しいセットの交差点を見ることができます。

class MyClass: 

    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return 'MyClass({})'.format(self.name) 

    def __eq__(self, other): 
     return isinstance(other, MyClass) 

    def __ne__(self, other): 
     return not self.__eq__(other) 

    def __hash__(self): 
     return 0 

existing_set = {MyClass('existing')} 
new_item = MyClass('new') 
intersection = {new_item}.intersection(existing_set) 

if intersection: 
    print('{} duplicate of {}'.format(new_item, intersection.pop())) 
    # MyClass(new) duplicate of MyClass(existing) 
else: 
    existing_set.add(new_item) 
print(existing_set) 
# {MyClass(existing)} 

新しい項目がセットにない場合は、2回の検索を行います。

編集:交差点は常に小さいセットのメンバーを返します。hereを参照してください。したがって、代わりにこの方法を使用することができます:

def isolate(new_item, existing_set): 
    for item in existing_set: 
     if item == new_item: 
      return item 
+0

偉大なアイデアを参照)。私は交差点を使うことを考えなかった。私は今このコードをチェックする時間がありません。私は週末の後に試してみると、うまくいくならあなたの答えを受け入れるでしょう。私はあなたの答えをupvotedしています。 –

+0

私の疑問は: 'intersection'は' existing_set'または 'new_item'の要素を持っていますか?私の 'eq'メソッドではどちらも同じですが、両方の要素の値が異なります。私は 'intersection'に' existing_set'からの要素を持たせたい –

+0

あなたはそうです - 交差点は常に小さな集合から項目を返します:http://stackoverflow.com/questions/20100003/whats-the-algorithm-of- set-intersection-in-python –

関連する問題