Я думал в том же духе, что и @slider, но вам может понравиться мой подход. Он использует ту же логику первого поиска ID
в списке из второго скрипта.
Основное отличие состоит в том, что я использовал списочное понимание, чтобы сделать код немного более компактным и избежать использования elif. Он также отслеживает различные совпадающие элементы в выходных списках, на случай, если вам понадобится доступ к ним позже.
class A(object):
def __init__(self, name, ID, desc):
self.name = name
self.ID = ID
self.desc = desc
class B(object):
def __init__(self, name, ID, desc):
self.name = name
self.ID = ID
self.desc = desc
def do_bad(a):
print('catch some errors here')
return a
def do_matching_action(a):
print('Found match with name = {0}, ID = {1}, and desc = {2}'.format(a.name, a.ID, a.desc))
return a
item1 = A('name', 1, 'weird_desc')
item2 = A('name', 2, 'weird_desc')
item3 = A('name', 3, 'not_same_desc')
item4 = A('name', 4, 'wei')
item5 = B('name', 1, 'weird_desc')
list1 = [item1, item2, item1, item2, item5]
list2 = [item3, item4, item1, item4, item1]
id_dict = {a.ID: a for a in list2}
common_objects = [a for a in list1 if a.ID in id_dict.keys()]
uncommon_objects = [a for a in list1 if a.ID not in id_dict.keys()]
#peform matching tests
match1 = [do_matching_action(a) for a, b in common_objects if (a.name == b.name) and (a.ID == b.ID) and a.desc.startswith(b.desc)]
#catch some errors
bad = [do_bad(a) for a in uncommon_objects]