Суммирование вместо переопределения значений в словарном понимании - PullRequest
0 голосов
/ 15 сентября 2018

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

>>> dct = {-1: 1, 0: 2, 1: 3}
>>> {k**2: v for k, v in dct.items()}
{1: 3, 0: 2}

Однако в данном случае я хочу получить {1: 4, 0: 2}, поскольку квадрат 1 и -1 равен 1, а 1 + 3 = 4.

Ясно, что я могу сделать это с помощью цикла for, но есть ли сокращение?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Один из самых быстрых способов подсчета сумм - использовать defaultdict - словарь с самоинициализацией:

from collections import defaultdict
new = defaultdict(int)
for k, v in old.items():
    new[k**2] += v
0 голосов
/ 15 сентября 2018

Не существует сокращенной версии, поскольку ваше понимание должно отслеживать текущее состояние, которое невозможно выполнить.Как вы сказали, ответом является цикл for:

old = {-1: 1, 0: 2, 1:3}
new = {}
for k, v in old.items():
    new[k**2] = new.get(k**2, 0) + v

Трюк с использованием метода dict.get, который я видел где-то в документации по Python.Он делает то же самое, что и:

if k**2 in new:
   new[k**2] += v
else:
   new[k**2] = v

Но в этом варианте используется метод get, который возвращает значение по умолчанию 0, которое добавляется к значению, которое будет назначено (когда ключ не существует),Так как это 0, а значения добавляются числа, 0 не имеет никакого эффекта.Напротив, если вам нужно было получить продукт, вы бы использовали 1 в качестве значения по умолчанию, поскольку начало с 0 будет означать, что вы никогда не увеличите значение.

Кроме того, последний, более многословный, метод, показанный выше, оценивает k**2 дважды за цикл, который использует вычисления.Чтобы сделать это, 1 вычисление потребует другой строки кода , что, на мой взгляд, не стоит того времени, когда метод get намного чище.

...