подходит вам заявленная проблема , но я предлагаю изменить вашу базовую структуру данных. Кортежи намного быстрее для небольших элементов, таких как пункт. Вы можете сохранить ясность словаря, используя namedtuple
, если хотите.
>>> from collections import namedtuple
>>> A = [
[{'x': 1, 'y': 0}, {'x': 2, 'y': 3}, {'x': 3, 'y': 4}, {'x': 4, 'y': 7}],
[{'x': 1, 'y': 0}, {'x': 2, 'y': 2}, {'x': 3, 'y': 13}, {'x': 4, 'y': 0}],
[{'x': 1, 'y': 20}, {'x': 2, 'y': 4}, {'x': 3, 'y': 0}, {'x': 4, 'y': 8}]
]
Создание Point
namedtuple просто
>>> Point = namedtuple('Point', 'x y')
Это то, что экземпляр выглядит
>>> Point(x=1, y=0) # Point(1, 0) also works
Point(x=1, y=0)
A
будет выглядеть следующим образом
>>> A = [[Point(**y) for y in x] for x in A]
>>> A
[[Point(x=1, y=0), Point(x=2, y=3), Point(x=3, y=4), Point(x=4, y=7)],
[Point(x=1, y=0), Point(x=2, y=2), Point(x=3, y=13), Point(x=4, y=0)],
[Point(x=1, y=20), Point(x=2, y=4), Point(x=3, y=0), Point(x=4, y=8)]]
Теперь работает как это гораздо проще:
>>> from operator import attrgetter
>>> [max(row, key=attrgetter('y')) for row in A]
[Point(x=4, y=7), Point(x=3, y=13), Point(x=1, y=20)]
Чтобы сохранить преимущество скорости кортежей, лучше получить доступ по индексу:
>>> from operator import itemgetter
>>> [max(row, key=itemgetter(2)) for row in A]
[Point(x=4, y=7), Point(x=3, y=13), Point(x=1, y=20)]
почему вы помечать этот NumPy? Кроме того, кортеж выглядит гораздо более быстрой структурой данных для использования, вы можете сохранить ясность словаря, если вы этого желаете, используя 'collections.namedtuple' – jamylak