2011-10-26 33 views
1

如果ab匹配元素值對象的列表,每一個名稱屬性(例如a1 = A("1")b1 = B("1")等),我將如何檢查等價?我目前正在這樣做:獲取兩個陣列

aList = [ a1, a2, a3, a4, a5 ] 
bList = [ b1, b2 ] 
aNameList = [] 
bNameList = [] 

for i in aList: 
    aNameList.append(i.name) 
for i in bList: 
    bNameList.append(i.name) 

match = set(aNameList) & set(bNameList) 

>>> set(['1', '2']) 

但它似乎有點長和不必要的。有什麼更好的方法來做到這一點?

回答

4

您可以使用列表解析法,以取代例如那些臨時列表和for循環:

match = set([ x.name for x in aList ]) & set ([ x.name for x in bList ]) 
+0

感謝您的評論,您的權利...我的牀上時間(對於未來的讀者,我刪除了我的評論) – fceruti

+0

'set'將接受一個生成器,所以方括號是不必要的。 –

+0

@KarlKnechtel方括號在風格上會更好還是完全沒有必要? – idlackage

0

operator.attrgetter功能被設計來提取感興趣的領域:

set(map(attrgetter('name'), aList)) & set(map(attrgetter('name'), bList)) 
0

可以用地圖 替換列表理解(替換臨時列表和for循環):

name = lambda: n: n[name] 
match = set(map(name,aList))&set(map(name,bList))