Со списком вроде этого:

[1,1,1,2,2,3,3,3]

Я хотел бы получить суммы каждого уникального числа [1,2,3], которое равно [3, 4, 9]. Используя подход из связанного сообщения Как получить уникальные значения с соответствующим количеством вхождений из списка в Python? Я могу получить количество вхождений каждого уникального числа, используя:

L = [1,1,1,2,2,3,3,3]
uniq, counts = np.unique(L, return_counts=True)
counts

Что дает результат [3, 2, 3]. Благодаря этому я могу получить то, что ищу, используя громоздкий подход с перечисленным For Loop и некоторыми довольно загадочными условиями:

L = [1,1,1,2,2,3,3,3]
elements = [3,2,3]

sums = []
index = 0
for i, e in enumerate(elements):
    if i == 0:
        sums.append(sum(L[0:e]))
        index = index + e
    else:
        sums.append(sum(L[index:index + e]))
        index = index + e
sums

Что дает желаемый результат [3, 4, 9]. Кто-нибудь знает, можно ли сделать то же самое чуть более элегантно?

5
vestland 4 Май 2021 в 00:29

4 ответа

Лучший ответ

Поскольку вы используете Numpy, вы можете просто умножить результаты, которые у вас уже есть, от np.unique:

import numpy as np

L = [1,1,1,2,2,3,3,3]    
uniq, counts = np.unique(L, return_counts=True)

uniq * counts
# array([3, 4, 9])
3
Mark 3 Май 2021 в 21:33

Это решение предполагает, что уникальные номера уже сгруппированы вместе:

from itertools import groupby

numbers = [1, 1, 1, 2, 2, 3, 3, 3]

print([sum(group) for _, group in groupby(numbers)])

Выход:

[3, 4, 9]
>>> 
1
Paul M. 3 Май 2021 в 21:32

Вы можете сделать что-то подобное, используя defaultdict или dict

Использование defaultdict:

from collections import defaultdict

a = [1, 1, 1, 2, 2, 3, 3, 3]
out = defaultdict(int)

for k in a :
    out[k] += k

print(list(out.values()))
# [3, 4, 9]

Использование dict:

a = [1, 1, 1, 2, 2, 3, 3, 3]
out = {}

for k in a:
    if k in out:
        out[k] += k
    else:
        out[k] = k

print(list(out.values()))
# [3, 4, 9]
1
Chiheb Nexus 3 Май 2021 в 21:41

Вы можете использовать collections.Couter() :

from collections import Counter

>>>L = [1,1,1,2,2,3,3,3]
>>>[k*v for k,v in Counter(L).items()]
[3, 4, 9]

Или в диктовке:

>>>{k:k*v for k,v in Counter(L).items()}
{1: 3, 2: 4, 3: 9}
1
zazz 3 Май 2021 в 22:58