Не используйте oneliner. Вместо этого используйте collections.defaultdict
и простой цикл:
>>> pairs = [('a', 1), ('b', 3), ('a', 4), ('c', 9), ('b', 1), ('d', 3)]
>>> result = defaultdict(int)
>>> for key, value in pairs:
... result[key] += value
...
>>> result
defaultdict(<class 'int'>, {'a': 5, 'c': 9, 'b': 4, 'd': 3})
Легко понять, питонов и быстро.
Оператор yield
, используемый в функции, превращает эту функцию в «генератор» (функцию, которая создает итератор). Результирующий итератор обычно возобновляется вызовом next ()
. Однако можно отправить значения функции, вызвав метод send ()
вместо next ()
, чтобы возобновить ее:
cr.send(1)
В вашем примере это присвоит значение 1
до c
каждый раз.
cr.next ()
фактически эквивалентен cr.send (None)
Вы можете отправлять значения в генератор с помощью функции send
.
Если вы выполните:
p = protocol()
p.next() # advance to the yield statement, otherwise I can't call send
p.send(5)
, то yield
вернет 5, поэтому внутри генератора c
будет 5.
Также, если вы вызовете p. next ()
, yield
вернет None
.
Дополнительную информацию можно найти здесь .