2010-10-05 2 views
2

Каждый пример использования списка или набора в 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 должен быть более простой способ.

+0

Почему бы не использовать словарь? – JoshD

ответ

4

Звучит так, как будто вам может быть лучше с 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} 
+0

ОК, спасибо, теперь это работает! Я пытался заставить это работать все утро, так что это была большая помощь! – Makis

1

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

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) 
+0

Я принял ответ Тима, потому что он был очень немного понятен благодаря первому абзацу, но спасибо за ваш ответ. – Makis

0

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