2017-02-20 10 views
3

Я очень новичок в Python и программировании, и я стараюсь понять проблему. Любая помощь приветствуется.Python: Как разбить значения и найти средние по категориям

У меня есть Deque ценностей и категорий:

deque([(3000.0, category1), (6000.0, category1), (8000.0, category2), (3000.0, category3), (7000.0, category3), (4500.0, category3)]) 

Я пытаюсь использовать словарь для печати среднего значения каждого категории. Например, category1 = (3000 + 6000)/2; category2 = 8000/1; category3 = (3000 + 7000 + 4500)/3.

Есть ли простой способ сделать это? До сих пор моя единственная мысль, чтобы создать список уникальных категорий:

catetory_list = [] 
for i in deque: 
    if i[1] not in category_list: 
    category_list.append(i[1]) 

Я думаю, я пропускаю что-то важное здесь, но не может найти следующий шаг.

Здесь я нашел некоторые аналогичные проблемы, а именно here и here, но я борюсь за то, как сделать это подходящим для моего вопроса.

+0

Добро пожаловать в Stack O verflow! Сначала вы можете взять тур (http://stackoverflow.com/tour) и узнать [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) и создать [ Minimal, Complete и Verifiable] (http://stackoverflow.com/help/mcve). Это облегчает нам помощь. –

+0

@StephenRauch Хорошо, похоже, мой вопрос не очень ясен. Я действительно пытался. :(Я попытаюсь отредактировать свой пост для ясности. – Nat

+1

см .: http://stackoverflow.com/q/42309909/7484636 – KernelPanic

ответ

3

Вы были близки, я думаю, вам нужно построить dict со значениями. А затем усреднить значения впоследствии:

Образец данных:

my_dq = deque([ 
    (3000.0, 'category1'), (6000.0, 'category1'), (8000.0, 'category2'), 
    (3000.0, 'category3'), (7000.0, 'category3'), (4500.0, 'category3')]) 

Код:

categories = {} 
for i in my_dq: 
    categories.setdefault(i[1], []).append(i[0]) 
categories = {k: sum(v)/len(v) for k, v in categories.items()} 

Результаты:

{'category1': 4500.0, 'category3': 4833.3333, 'category2': 8000.0} 
+0

... с очевидной оптимизацией для суммирования значений по мере продвижения и сохранения общего количества элементов (которые могут/могут не стоить) – csl

+0

@csl, Да, это будет зависеть от ожидаемой длины списков ... –