複数のフィールドを持つカスタムオブジェクトを定義しました。複数のリストから一意のオブジェクトリストを作成する
たとえば、名前、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
私は何か間違っていますか?
内蔵のセットタイプを使用しない理由:
あなた
Student
クラスは__eq__
だと互換性のある__hash__
を実装する必要がありますか?メンバーシップテストは、おそらくあなたが純粋なPythonで望むよりも効率的です。 –@omribなので、生徒の各リストを繰り返して、newSet.add(student)を呼び出すのはそれが得られるほど良いですか? – MxyL
@agf、ああ、私はそれがセット内にアイテムが存在するかどうかをチェックするだけで十分だろうと思っていました。すなわち:「メンバーシップをテストする」 – MxyL