Не существует сокращенной версии, поскольку ваше понимание должно отслеживать текущее состояние, которое невозможно выполнить.Как вы сказали, ответом является цикл 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
намного чище.