で2クラス要素の比較:だから基本的に私は、次のように2つのリストを持っているは、私は以下に定義されたクラスを持っているのPython
CourseA = []
CourseB = []
// Extract (multiple) first_name, last_name, age from a file
CourseA.append(Members(first_name, last_name, age)) # called multiple times
// Extract (multiple) first_name, last_name, age from a file
CourseB.append(Members(first_name, last_name, age)) # called multiple times
:
class Members(object):
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
私は、そのクラスのインスタンスを含む2つのリストを作成しました:
# CourseA
John, Smith, 12
Jane, Doe, 14
Susan, Patton, 13
# CourseB
Richard, Lane, 12
Susan, Patton, 13
は、今私はのfirst_name
とlast_name
を比較したいですおよびCourseB
。両方が同じ場合は、対応する年齢を印刷します。この場合、 "Susan Patton"は両方のリストの共通名なので、 "13"を印刷します。
これを行う最も効率的な方法は何ですか?どちらのリストも巨大で、CourseA
の名前とCourseB
のすべての名前を比較して、CourseA
の次の名前とCourseB
のすべての名前を比較すると考えましたが、これは非常に遅い方法のようです。
ETA:これでクラス定義に次のコードを追加しました。
def __hash__(self):
return hash((self.first_name, self.last_name))
def __eq__(self):
try:
return (self.first_name, self.last_name) == (other.first_name, other.last_name)
except AttributeError:
return False
次に、次のように比較します。ところで、私のクラス定義には__eq__
と__hash__
がなくても以下の比較のように思えます。
CourseA_set = set((x.first_name, x.last_name) for x in CourseA)
CourseB_set = set((y.first_name, y.last_name) for y in CourseB)
for (caller, callee) in CourseA_set.intersection(CourseB_set):
print ("Found: {0}".format((caller, callee)))
私はCourseA
とCourseB
の両方で発見されfirst_name
とlast_name
を得ますか。しかし、他の対応する属性をCourseA
とCourseB
から得るにはどうすればいいですか?age
?
CourseA
とCourseB
リストを検索して対応する年齢を取得するには、(first_name, last_name)
のリストを検索する必要がありますか?これは非効率的なようだ。
'__eq__'と' __hash__'を実装すると、これを簡単に設定することができます。 – jonrsharpe
年齢の違いにはどうしたらいいですか? – frist
@fristそれは両方の年齢を印刷する必要があります – Rayne