Изобретая класс Counter из коллекции коллекций

1

Просто для удовольствия я попытался изобрести класс Counter из модуля collections.

Мое намерение было простым. Учитывая список, сопоставьте элемент с частотой, в которой он встречается.

Вот что я написал:

>>> l
['a', 'a', 'b', 'c']
>>> d = {}
>>> for a in l:
    d[a] = l.count(a)
>>> d
{'a': 2, 'c': 1, 'b': 1}

Просто интересно, насколько это хорошо или плохо?

  • 0
    Это похоже на вопрос, который относится к Code Review .
Теги:
dictionary
counter

2 ответа

3

Давайте сосредоточимся на единственной соответствующей части:

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
0

Ну, это может быть быстрее, вы повторяете список n * n раз; где n - длина списка. Если вы вместо этого перешли список и увеличили значение этого элемента в своей частотной таблице всякий раз, когда вы столкнулись с ним, вы бы делали меньше работы (n много раз, поэтому, не считая времени, затраченного на словарь, который я бы установил постоянным.)

С другой стороны, ваша версия концептуально проста и понятна.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню