Другой вариант здесь - использовать itertools.groupby
. Но так как это группирует только последовательные ключи, вам сначала нужно отсортировать координаты.
Сначала мы можем zip
их вместе создать кортежи вида (x, y, a)
. Затем отсортируйте их по (x, y)
координатам:
sc = sorted(zip(X, Y, A), key=lambda P: (P[0], P[1])) # sorted coordinates
print(sc)
#[(1.0, 8.0, 13), (2.0, 3.0, 16), (2.0, 3.0, 8), (3.0, 4.0, 20)]
Теперь мы можем groupby
координаты и суммировать значения:
from itertools import groupby
print([(*a, sum(c[2] for c in b)) for a, b in groupby(sc, key=lambda P: (P[0], P[1]))])
#[(1.0, 8.0, 13), (2.0, 3.0, 24), (3.0, 4.0, 20)]
И поскольку zip
является его собственным обратным , вы можете получить New_X
, New_Y
и New_A
через:
New_X, New_Y, New_A = zip(
*((*a, sum(c[2] for c in b)) for a, b in groupby(sc, key=lambda P: (P[0], P[1])))
)
print(New_X)
print(New_Y)
print(New_A)
#(1.0, 2.0, 3.0)
#(8.0, 3.0, 4.0)
#(13, 24, 20)
Конечно, вы можете сделать все это в одной строке, но я разбил его на части, чтобы было легче понять.