如果a
和b
是对象列表,每个对象都有名称属性(例如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'])
但似乎有点长且没必要。有什么更好的方法呢?
答案 0 :(得分:4)
您可以使用列表推导来替换示例中的临时列表和for循环:
match = set( [ x.name for x in aList ] ) & set ( [ x.name for x in bList ] )
答案 1 :(得分:0)
operator.attrgetter函数旨在提取感兴趣的字段:
set(map(attrgetter('name'), aList)) & set(map(attrgetter('name'), bList))
答案 2 :(得分:0)
你可以用map替换列表理解(替换临时列表和for循环) 像:
name = lambda: n: n[name]
match = set(map(name,aList))&set(map(name,bList))