我有一個類定義如下:比較2類元件在Python
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 = []
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
所以基本上我有2所列出像下面:
# CourseA
John, Smith, 12
Jane, Doe, 14
Susan, Patton, 13
# CourseB
Richard, Lane, 12
Susan, Patton, 13
現在我想比較的的first_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