Коллекции.Счетчик в Питон3


Можете ли вы подсказать, как я могу сделать следующий код более эффективным:

from collections import Counter

a = [1,1,3,3,1,3,2,1,4,1,6,6]

c = Counter(a)

length = len(set(c.values()))

normalisedValueCount = {}
previousCount = 0
i = 0
for key in sorted(c, reverse=True):
    count = c[key]

    if not previousCount == count:
        i = i+1
        previousCount = count

    normalisedValueCount[key] = i/length

print(normalisedValueCount)

Это в принципе дает словарь, похожими на прилавок, но вместо того, чтобы подсчитывать количество повторений, в нем содержится утяжелитель на основе количества вхождений.

  • Число 1 связано с 1.0 (4/Длина), поскольку оно происходит наиболее часто.
  • 2 и 4 встречаются реже и связаны со значением 1/длина.
  • 6 является вторым по крайней мере, встречающееся значение и связан с 2/Длина.
  • 3-это третья наименее встречающееся значение и связан с 3/длина.

Еще несколько примеров:

  • Список в[1,2,3] результаты в normalisedValueCount из 1:1.0, 2:1.0, 3:1.0.
  • Список в[2,1,2] результаты в normalisedValueCount из 2:1.0, 1:0.5.
  • Список в[2,1,2,3] результаты в normalisedValueCount из 2:1.0, 1:0.5, 3:0.5.
  • Список в[2,2,2,2,2,2,2,2,2,2,1,2,3,3] результаты в normalisedValueCount из 2:1.0, 3:0.66666, 1:0.33333.


2709
3
задан 23 сентября 2011 в 08:09 Источник Поделиться
Комментарии
1 ответ

Я понятия не имею, что код делает, он не похож ни на нормализации, которые я видел. Я бы предложил более конкретные предложения по реструктуризации, если я понял, что вы делаете.

Вы:


  1. Поставить на счетчик

  2. Поставил значения счетчика в набор

  3. сортировать ключи от счетчика

Я бы поискала другой подход, который не требует так много двигаются.

if not previousCount == count:

лучше

if previousCount != count:

Редактировать


  1. Счетчик.most_common возвращает то, что вы идете через отсортированный(с, обратного=истина)

  2. модуле itertools.метод groupBy позволяет сгруппировать общие элементы хорошо (например тот же граф)

  3. перечисление может быть использована для подсчета по элементам в списке, а затем следить за счетчиком

Мой код:

c = Counter(a)
length = len(set(c.values()))
counter_groups = itertools.groupby(c.most_common(), key = lambda x: x[1]))
normalisedValueCount = {}
for i, (group_key, items) in enumerate(counter_groups)
for key, count in items:
normalisedValueCount[key] = (i+1)/length

1
ответ дан 23 сентября 2011 в 10:09 Источник Поделиться