Объединение двух списков объектов на основе атрибута

Каждый пример использования списка или набора в Python, по-видимому, включает тривиальные случаи целых чисел, но у меня есть два списка объектов, где атрибут name определяет, являются ли экземпляры двух объектов «одинаковыми» или нет (другие атрибуты могут иметь разные значения).

Я могу создать список, содержащий все элементы из обоих списков, отсортированные, с

tmpList = sorted(list1 + list2, key=attrgetter('name')) 

но как мне сделать то же самое, чтобы элементы списка, которые имеют одинаковое значение в атрибуте имени, выбираются из второго списка?

Например, объединение этих двух списков

 list1 = [obj('Harry',18), obj('Mary',27), obj('Tim', 7)] list2 = [obj('Harry', 22), obj('Mary', 27), obj('Frank', 40)] 

приведет к

 list = [obj('Harry',22), obj('Mary', 27), obj('Tim', 7), obj('Frank', 40)] 

(Я использовал obj () как короткую нотацию для объекта, который имеет два атрибута.)

Похоже, я не могу использовать функцию attrgetter () в большинстве функций set и list, как я могу, с помощью функции sorted (), поэтому я не могу понять, как я должен это делать. Я подозреваю, что могу использовать функцию лямбда, но я не слишком хорошо знаком с функциональным программированием, поэтому мне, похоже, не удается понять это.

Наивное решение (сначала выбрать все элементы, которые являются уникальными в обоих списках, а затем объединить этот список с остатком второго списка) кажется довольно длинным, поэтому в Python должен быть более простой способ.

Звучит для меня, как вам может быть лучше с помощью dict вместо списка, используя имя в качестве ключа, а остальную часть объекта как значение. Затем вы можете просто dict1.update(dict2) .

 >>> dict1 = {"Harry": 18, "Mary": 27, "Tim": 7} >>> dict2 = {"Harry": 22, "Mary": 27, "Frank": 40} >>> dict1.update(dict2) >>> dict1 {'Tim': 7, 'Harry': 22, 'Frank': 40, 'Mary': 27} 

Да. Простым способом является словарь.

 list1 = {"Harry": 18, "Mary": 27, "Tim": 7} list2 = {"Harry": 22, "Mary": 27, "Frank": 40} list1.update(list2) 

список теперь {'Harry':22, 'Mary': 27, 'Tim': 7, 'Frank': 40}

Если ваши данные больше, чем просто цифры, все в порядке. Вы можете поместить любой объект в качестве значения для словаря.

 list1['Harry'] = (1,"weee",54.55) 

Вы можете реализовать атрибут __eq__ в своем объекте. Исходя из этого, вы можете сравнить свои объекты с оператором ==.