Просто для удовольствия я попытался изобрести класс Counter
из модуля collections
.
Мое намерение было простым. Учитывая список, сопоставьте элемент с частотой, в которой он встречается.
Вот что я написал:
>>> l
['a', 'a', 'b', 'c']
>>> d = {}
>>> for a in l:
d[a] = l.count(a)
>>> d
{'a': 2, 'c': 1, 'b': 1}
Просто интересно, насколько это хорошо или плохо?
Давайте сосредоточимся на единственной соответствующей части:
for a in l:
d[a] = l.count(a)
Это довольно плохо, он вызывает .count()
для КАЖДОГО члена и .count()
просматривает каждый элемент, так что эта сложность O (n ^ 2).
Это O (n):
l = ['a', 'a', 'b', 'c']
d = {}
for a in l:
if a in d: # we saw a before
d[a] += 1
else:
d[a] = 1
Ну, это может быть быстрее, вы повторяете список n * n
раз; где n
- длина списка. Если вы вместо этого перешли список и увеличили значение этого элемента в своей частотной таблице всякий раз, когда вы столкнулись с ним, вы бы делали меньше работы (n
много раз, поэтому, не считая времени, затраченного на словарь, который я бы установил постоянным.)
С другой стороны, ваша версия концептуально проста и понятна.