Объединение двух списков объектов на основе атрибута
Каждый пример использования списка или набора в 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 должен быть более простой способ.
- Попытка создания файлов для каждого дня в месяц
- Как выполнить операцию удаления одной строки
- Перечислить понимание подписок?
- Python :: "IndexError: индекс индекса вне диапазона"
- Как разрезать каждый n-й элемент в индексе с помощью 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__
в своем объекте. Исходя из этого, вы можете сравнить свои объекты с оператором ==.
- Pythonic получает элемент массива или по умолчанию, если он не существует
- выполнить команду 'ls' в качестве другого пользователя в скрипте python
- Список всегда сбрасывается?
- Питонический способ добавления списка в один цикл
- Как проверить, являются ли элементы списка смежными
- как искать или находить определенную подстроку в списке
- В python, что делает len (list)?
- как объединить два подсписок, разделяющих какое-то общее число?
- Как оптимизировать код для удаления n позиции во всех списках из списка списков
- Вставьте случайно выбранный элемент из одного списка в другой
- Оценка двух или более списков