Как получить список объектов по максимальному значению атрибута из N мультисписка объектов?

У меня есть мультисписок объектов следующим образом (упрощенная версия)

listA = [[obj1(val=1),obj2(val=1)],[obj2(val=4),obj3(val=2)]]
listB = [[obj4(val=1),obj5(val=1)],[obj6(val=5),obj7(val=3)]]
listC = [[obj8(val=1),obj9(val=1)],[obj10(val=6),obj11(val=4)]]

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

выход:

maxList = [obj1(value=1),obj10(val=6)]

Существует аналогичный вопрос для получения объекта с максимальным значением атрибута из списка, но этот случай для мультисписка. Я знаю, что этого можно добиться с помощью вложенных циклов for, но должен ли быть лучший способ сделать это с помощью itertools и getattr?


person Suhail Sheth    schedule 18.06.2019    source источник


Ответы (1)


Чтобы упростить, давайте продемонстрируем на обычных целых числах. Адаптируйте этот подход к своему объекту.

Дано

import itertools as it


a = [[1, 1], [3, 2]]
b = [[1, 1], [5, 3]]
c = [[1, 1], [6, 3]]

Код

list(map(max, [list(it.chain(*col)) for col in zip(a, b, c)]))
# [1, 6]

Эквивалентно

[max([x for x in it.chain(*col)]) for col in zip(a, b, c)]
# [1, 6]
person pylang    schedule 18.06.2019
comment
Спасибо, это работает идеально. Вы можете сделать для мультисписка 'N', объединив весь мультисписок в один большой список - mylists=[a,b,c,...] . Затем замените zip(a,b,c) на zip(*mylists). - person Suhail Sheth; 18.06.2019