2016-01-08 5 views
2

Я хочу подсчитать экземпляры X в списке, аналогичныевзвешенного подсчета в Python

How can I count the occurrences of a list item in Python?

, но принимая во внимание вес для каждого экземпляра.

Например,

L = [(a,4), (a,1), (b,1), (b,1)] 

функция weighted_count() должна возвращать что-то вроде

[(a,5), (b,2)] 

Отредактировано добавить: мой а, Ь будет целые числа.

+3

Как уже пытались решить эту проблему до сих пор? – Turn

ответ

1

Следующие даст вам словарь всех букв в массиве и их соответствующих подсчетов

counts = {} 
for value in L: 
    if value[0] in counts: 
     counts[value[0]] += value[1] 
    else: 
     counts[value[0]] = value[1] 

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

def countOf(x,L): 
    filteredL = list(filter(lambda value: value[0] == x,L)) 
    return sum(list(map(lambda value: value[1], filteredL))) 
1
>>> import itertools 
>>> L = [ ('a',4), ('a',1), ('b',1), ('b',1) ] 
>>> [(k, sum(amt for _,amt in v)) for k,v in itertools.groupby(sorted(L), key=lambda tup: tup[0])] 
[('a', 5), ('b', 2)] 
3

вы можете использовать счетчик:

from collections import Counter 
c = Counter() 
for k,v in L: 
    c.update({k:v}) 
print c 
+0

Это, похоже, не запоминает порядок. Например, это делается для [(2, 1), (2, 2), (2, 1), (3, 1), (2, 1), (5, 1), (2, 2)] ({1: 5, 2: 5, 3: 1, 5: 1}) –

1

defaultdict будет делать:

from collections import defaultdict 

L = [('a',4), ('a',1), ('b',1), ('b',1)] 
res = defaultdict(int) 
for k, v in L: 
    res[k] += v 
print(list(res.items())) 

печатает:

[('b', 2), ('a', 5)] 
0

Используйте словари get.

>>> d = {} 
>>> for item in L: 
...  d[item[0]] = d.get(item[0], 0) + item[1] 
... 
>>> d 
{'a': 5, 'b': 2} 
0

Группа элементов с появлением первого элемента каждого кортежа, используя groupby из itertools:

>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> L = [('a',4), ('a',1), ('b',1), ('b',1)] 
>>> L_new = [] 
>>> for k,v in groupby(L,key=itemgetter(0)): 
    L_new.append((k,sum(map(itemgetter(1), v)))) 

>>> L_new 
[('a', 5), ('b', 2)] 
>>> L_new = [(k,sum(map(itemgetter(1), v))) for k,v in groupby(L, key=itemgetter(0))] #for those fun of list comprehension and one liner expression 
>>> L_new 
[('a', 5), ('b', 2)] 

Испытано в обоих python2 & Python3

Смежные вопросы