Существует ли более простой способ выполнения и сгруппированных сумм в матрице? - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь выполнить групповую сумму, но без панд или numpy. Вот что я сделал:

t = []
u = []

data = [[[1,11], [1, 10], [2, 20], [2,15], [2, 100], [3, 56]]]

for x in data[0]:
    t.append(x[0])
'    print(x[0])'

u = list(set(t))
'print(t)'
'print(u[1])'
t = [0]*(len(t)-1)
for i in range(len(u)):
    for x in data[0]:
        if x[0] == u[i]:
            t[i] = t[i] + x[1]
            'print(t[i])'

'print(t)'
t.remove(0)
'print(t)'
t1 = list(zip(u, t))

t1

Вывод правильный, однако код чертовски уродливый, и в исходном задании я должен сгруппировать матрицу по двум категориям, а не только по одной, чтобы код был более уродливым...

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Вот один из способов сделать это:

import collections

data = [[[1,11], [1, 10], [2, 20], [2,15], [2, 100], [3, 56]]]
# why not data = [[1,11], [1, 10], [2, 20], [2,15], [2, 100], [3, 56]] ???

sums = collections.defaultdict(int)
for k, v in data[0]:  # data[0] because data is in strange format
    sums[k] += v
0 голосов
/ 05 октября 2019

Я думаю, вам нужен по умолчанию dict

from collections import defaultdict

data = [[[1, 11], [1, 10], [2, 20], [2, 15], [2, 100], [3, 56]]]


def grouped_sum(matrix):
    groups = defaultdict(int)
    for y, row in enumerate(matrix):
        for x, (group, value) in enumerate(row):
            groups[group] += value
    return groups


print(grouped_sum(data))
# defaultdict(<class 'int'>, {1: 21, 2: 135, 3: 56})

# or if you need it in with the same type
print(list(grouped_sum(data).items()))
# [(1, 21), (2, 135), (3, 56)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...