В качестве продолжения этого вопроса, который был решен с помощью Counter()
, я столкнулся с новой проблемой, которую, по-видимому, достаточно легко решить - за исключением того, что я не могу заставить ее работать.
Я пытаюсь использовать Counter()
для суммирования серии записей dict, которая работает, если сумма является положительным целым числом, НО возвращает пустой элемент, если сумма является отрицательным целым числом. Я смог найти этот ответ, который прямо сейчас объясняет, что Counter()
предназначен для подсчета, а не для суммирования, по сути.
Я могу воссоздать пример и заставить его работать, но с набором запросов django, в сочетании с методом Counter()
, создается более сложный словарь, который выглядит следующим образом.
totals = {
'sumthing_a': Counter({'total': 48000}),
'sumthing_b': Counter({'total': 39050}),
'sumthing_c': Counter({'total': 8950}),
'sumthing_d': Counter({'total': 10000}),
'sumthing_e': Counter({'total': 17200}),
'sumthing_f': Counter({'total': 17750}),
'sumthing_g': Counter({'total': 30450}),
}
Я пробовал варианты:
totals.update({'sumthing_e': Counter({'total': 300})})
, который заменяет исходный 17200 на 300 вместо их добавления.
Я тоже пробовал:
totals['sumthing_e'].update({'sumthing_e': Counter({'total': 300})})
который бросает: unsupported operand type(s) for +: 'Counter' and 'int'
Документация для .update()
гласит:
Элементы считаются из итерируемого или добавляемого из другого отображения
(или счетчик). Как и в dict.update (), но вместо замены добавляет количество
их. Кроме того, итерируемый, как ожидается, будет последовательность элементов, а не
последовательность пар (ключ, значение).
И есть документация, в которой говорится:
Для операций на месте, таких как c [key] + = 1, тип значения нужен только
Поддержка сложения и вычитания. Таким образом, дроби, числа с плавающей запятой и десятичные дроби
будет работать и отрицательные значения поддерживаются. То же самое верно и
для update () и subtract (), которые допускают отрицательные и нулевые значения для
оба входа и выхода.
Это заставляет меня верить, что то, что я пытаюсь сделать, возможно, если оно правильно закодировано. Конечным результатом должна стать возможность иметь отрицательное число - например:
totals = {
'sumthing_a': Counter({'total': 48000}),
'sumthing_b': Counter({'total': -40503}),
'sumthing_c': Counter({'total': 8950}),
'sumthing_d': Counter({'total': 10000}),
'sumthing_e': Counter({'total': -58462}),
'sumthing_f': Counter({'total': 17750}),
'sumthing_g': Counter({'total': 30450}),
}