2016-07-25 50 views
0

我有一個類定義如下:比較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))) 

我得到了在這兩個CourseACourseB發現first_namelast_name。但是,如何獲得CourseACourseB的其他相應屬性,如age

我是否需要搜索CourseACourseB列表以匹配(first_name, last_name)才能獲得相應的年齡?這似乎是低效的。

+1

如果你實現'__eq__'和'__hash__',你可以通過設置操作輕鬆完成。 – jonrsharpe

+0

年齡不同會發生什麼情況? – frist

+0

@frist它應該同時打印 – Rayne

回答

1

你用包含屬性的元組來替換類實例。而應該保持實例,因爲他們是在列表中,然後打開列表成爲集,而不會剝離的屬性關閉類

CourseA_set = set(CourseA) # no set comprehension 
CourseB_set = set(CourseB) 

for member in CourseA_set.intersection(CourseB_set): 
    print ("Found: {f} {l} {a}".format(f=member.first_name, 
             l=member.last_name, 
             a=member.age)) 

您已經實施將確保只有匹配first_name實例的__hash____eq__方法和兩個集合中的last_name在完成交集後保留。

+0

這不會匹配所有3個屬性嗎?我實際上只想匹配'first_name'和'last_name',然後從兩個對應於匹配的列表中打印出'age'的值。 – Rayne

+0

不,它不會。你的'__hash__'和'__eq__'是在'first_name'和'last_name'上實現的,所以'age'不會被考慮爲 –

+0

謝謝!我確實通過這種方式獲得了所有的屬性。但它似乎只從'CourseB'獲得屬性。我怎樣才能打印'CourseA'的屬性,因爲'age'可能會有所不同。 – Rayne