2016-01-01 1 views
4

Как еще «объединить» несколько Counter, но только принимая максимальное значение для каждой клавиши для «комбинированного» счетчика?Принимая максимум от нескольких счетчиков вместо их добавления - Python

Учитывая несколько счетчиков, как, например:

>>> from collections import Counter 
>>> x = Counter([('a'), ('a', 'bc'), ('a', 'bc'), ('xyz', 'hooli')]) 
>>> y = Counter([('a'), ('a'), ('a'), ('asd', 'asd')]) 

Я мог бы сделать это, чтобы добавить их:

>>> x + y 
Counter({'a': 4, ('a', 'bc'): 2, ('asd', 'asd'): 1, ('xyz', 'hooli'): 1}) 

Но если моя цель состоит в том, чтобы получить объединить счетчики, но если у них есть тот же ключ, цель НЕ добавить значения вверх, но вместо этого взять максимум. Как мне это сделать?

Я попытался следующий код:

>>> z = Counter() 
>>> for c in [x,y]: 
...  for k in c: 
...    z[k] = max(z.get(k,0), c[k]) 
... 
>>> z 
Counter({'a': 3, ('a', 'bc'): 2, ('asd', 'asd'): 1, ('xyz', 'hooli'): 1}) 

Но есть другой способ достичь того же выход?

+2

Счетчики интуитивно не должны иметь эту функциональность, а не по всей видимости. Открыта для других структур данных? – Untitled123

+0

Несомненно, любая структура данных, которая может быть возвращена в счетчик, должна быть осуществимой. Пока структура данных имеет одинаковые или меньшие накладные расходы, чем счетчик. – alvas

+2

Из документов * Пересечение и объединение возвращают минимум и максимум соответствующих значений * –

ответ

3

Оператор Counter объединения (|) возвращает максимальное количество отсчетов:

>>> x | y 
Counter({'a': 3, ('a', 'bc'): 2, ('xyz', 'hooli'): 1, ('asd', 'asd'): 1}) 
+0

wow huh intuition снова не работает – Untitled123

+1

Это неудобно, я был просто на https://docs.python.org/2/library/collections.html и пропущен строка: >>> c | d # union: max (c [x], d [x]) Счетчик ({'a': 3, 'b': 2}) – Untitled123