В каждом внутреннем цикле for
вы не добавляете к текущему значению dict[letters]
, а устанавливаете его на любое значение, подсчитываемое для текущего подсписка (как правило) с именем word
.
Исправление вашего кода с помощью ванили dict
:
>>> l = [['<s>', 'a', 'a', 'b', 'b', 'c', 'c', '</s>'], ['<s>', 'a', 'c', 'b', 'c', '</s>'], ['<s>', 'b', 'c', 'c', 'a', 'b', '</s>']]
>>> d = {}
>>>
>>> for sublist in l:
...: for x in sublist:
...: d[x] = d.get(x, 0) + 1
>>> d
{'<s>': 3, 'a': 4, 'b': 5, 'c': 6, '</s>': 3}
Обратите внимание, что я не вызываю list.count
в каждом внутреннем цикле for
. Вызов count
будет повторять весь список снова и снова. Гораздо эффективнее просто добавлять 1
каждый раз, когда значение просматривается, что можно сделать, посмотрев на каждый элемент (под) списков ровно один раз.
Использование Counter
.
>>> from collections import Counter
>>> Counter(x for sub in l for x in sub)
Counter({'<s>': 3, 'a': 4, 'b': 5, 'c': 6, '</s>': 3})
Использование Counter
без ручного удаления вложенного списка:
>>> from collections import Counter
>>> from itertools import chain
>>> Counter(chain.from_iterable(l))
Counter({'<s>': 3, 'a': 4, 'b': 5, 'c': 6, '</s>': 3})