Используйте функцию генератора.
from collections import defaultdict
def with_running_count(values):
counts = defaultdict(int)
for value in values:
counts[value] += 1
yield value, counts[value]
>>> print(*with_running_count('abaab'))
('a', 1) ('b', 1) ('a', 2) ('a', 3) ('b', 2)
Одно из преимуществ использования генератора над другими предложениями состоит в том, что генераторы ленивы. Это означает, что вы можете передавать итераторы, которые возвращают бесконечный (или очень большой) поток данных, поскольку генератор потребляет только входной поток по мере необходимости.
# an endless iterator
coin = iter(lambda: random.choice(['heads', 'tails']), None)
# the running count will also be endless
toss = with_running_count(coin)
>>> next(toss), next(toss), next(toss)
(('tails', 1), ('tails', 2), ('heads', 1))