2011-08-11 16 views
4

複数のフィールドを持つカスタムオブジェクトを定義しました。複数のリストから一意のオブジェクトリストを作成する

たとえば、名前、ID、年齢で構成されるStudentオブジェクトがあるとします。 2人の学生を比較し、同じ学生であるかどうかを判断するために、私は__ eq__メソッドを実装しました。このメソッドは、2人の学生の年齢、名前、IDが一致するかどうかを返します。学生は一例ですので、学籍のがユニークになる傾向があるという事実が考慮されていないことを念頭に

 
def __eq__(self, other): 
    return self.name == other.name and self.ID == other.ID and self.age == other.age 

ベア。

学生の任意の数が

 
[S1, S2, S3] 
[S2, S3] 
[S3, S5, S4] 
[S1, S4, S2, S1] 

オブジェクトと私は、次の要素

 
S1, S2, S3, S4, S5 

に最も簡単な方法が含まれていますいくつかのデータ構造を作成したいと思う私は、次の登録リストを持っていると仮定たくさんのものを保持したり、アイテムをつかんだり、構造体に存在するかどうかをチェックしたり、そうでない場合は追加したりするデータ構造体を初期化することです。

 
new_list = some_new_list 
for each list of students: 
    for each student in the list: 
    check if the student is in new_list 
    #decide what to do 

私は単純なリストとしてそれを実施することを決定した場合は私のリストが成長し続けている、私は潜在的に、私は学生や入学リストのとんでもない量を持っている場合は特に、比較の多くを作ることができます。

これを実装する効率的な方法は何ですか?どちらも2つのオブジェクトを比較し、その比較メソッドを使用して固有のオブジェクトセットを生成します。

EDIT:簡単な実装を試しました。

 
>>>a = Student("sample", 1234, 18) 
>>>b = Student("sample", 1234, 18) 
>>>students = set() 
>>>students.add(a) 
>>>b in students 
False 
>>>b == a 
True 

私は何か間違っていますか?

+2

内蔵のセットタイプを使用しない理由:

あなたStudentクラスは__eq__だと互換性のある__hash__を実装する必要がありますか?メンバーシップテストは、おそらくあなたが純粋なPythonで望むよりも効率的です。 –

+0

@omribなので、生徒の各リストを繰り返して、newSet.add(student)を呼び出すのはそれが得られるほど良いですか? – MxyL

+0

@agf、ああ、私はそれがセット内にアイテムが存在するかどうかをチェックするだけで十分だろうと思っていました。すなわち:「メンバーシップをテストする」 – MxyL

答えて

8
from itertools import chain 
myset = set(chain(iterable1, iterable2, iterable3, iterable4)) 

を設定します。 chainは、一連の繰り返し可能プログラムから1つ長いiterableを行います。それをソートする必要がある場合は、sorted(myset)がソートされたリストを表示します。

def __hash__(self): 
    return (self.name, self.ID, self.age).__hash__() 
+0

そして、学生リストの数が(リストやタプルに 'student_lists'という名前で)含まれていれば、 'set(chain(* student_lists))'を使うことができます。 –

+0

@omrib 'set(chain.from_iterable(student_lists))'を使うと、 'student_lists'をアンパックする必要はありません。誰かが 'itertools.chain'を書いた人は' map'や 'zip'のようなものとは違って考えました。 – agf

+0

チップをありがとう!私はitertoolsの知識をリフレッシュする時間... –

-2

私はあなたのために1つの言葉を持っています。

はあなたがユニークなアイテムを取得し、あなたは一度だけ、それぞれのiterableを反復

Here are the docs for sets

関連する問題