Хотя есть много способов решить эту проблему в одной строке, я вижу много вопросов относительно того, можно ли здесь использовать operator.iadd
.
Не может.
Конечно, это появится , что
s = defaultdict(lambda a=[0]: operator.iadd(a[0], 1))
будет работать, но это не так.
Причина в официальных документах
Многие операции имеют версию «на месте».Ниже перечислены функции, обеспечивающие более простой доступ к операторам на месте, чем обычный синтаксис;например, оператор x + = y эквивалентен x = operator.iadd (x, y).Другой способ выразить это - сказать, что z = operator.iadd (x, y) эквивалентно составному выражению z = x;z + = y.
В этих примерах обратите внимание, что при вызове метода на месте вычисления и присваивание выполняются в два отдельных этапа.Перечисленные ниже функции на месте выполняют только первый шаг, вызывая метод на месте.Второй шаг, присвоение, не обрабатывается.
Для неизменяемых целей, таких как строки, числа и кортежи, обновленное значение вычисляется, но не присваивается обратно входной переменной:
>>> a = 'hello'
>>> iadd(a, ' world')
'hello world'
>>> a
'hello'
Для изменяемых целей, таких как списки и словари, метод на месте выполнит обновление, поэтому последующее присваивание не требуется.
Поскольку int
объекты являются неизменяемыми, вы не можете обновить a[0]
с помощью iadd
.
(я знаю, что это было сказано в других ответах; я просто подумал, что определенный ответ со ссылкой на документы по Python может быть полезен.)