2017-02-18 255 views
1

Я следующий списокPython словарь - найти среднее значение из других значений

count = 3.5, price = 2500 

count = 3, price = 400 

count = 2, price = 3000 

count = 3.5, price = 750 

count = 2, price = 500 

Я хочу найти среднюю цену для всех, где счетчик то же самое. Например:

count = 2, price = 3000 

count = 2, price = 500 

3000 + 500 = 3500 

3500/2 = 1750 

Avg для 'графа 2' 1750

Вот мой код до сих пор

avg_list = [value["average"] for value in dictionary_database_list] 

counter_obj = collections.Counter(count_list) 

print ("AVG:") 

for i in counter_obj: 

    print (i, counter_obj[i]) 
+0

Тег словаря выглядит как хороший старт - что вы пробовали? – KernelPanic

+2

прост в кодировке! подумайте немного сложнее, вы это сделаете !! :) – phunsukwangdu

+1

Если бы была функция, которая могла бы ** группировать ** элементы ** на ** общий ключ! О, подождите, [есть!] (Https://docs.python.org/3/library/itertools.html?highlight=groupby#itertools.groupby) –

ответ

1

Я признаю, что я не 100% ясно, что вы ищете здесь, но я дам ему выстрелили:

Хорошая стратегия когда вы хотите перебирать список «вещей» и накапливать какую-то информацию о «том же самом», это использовать хеш-таблицу. В Python мы обычно используем dict для алгоритмов, для которых требуется хеш-таблица.

Чтобы собрать достаточно информации, чтобы получить среднюю цену для каждого элемента в списке, мы должны:

а) общее количество элементов с конкретным «подсчет»

б) общее цена предметов со специфическим «счетом»

Итак, давайте построим структуру данных, которая отображает «счет» на диктовку, содержащую «общие элементы» и «общую цену» для элемента с этим «счетом».

Давайте возьмем наш вклад в формате:

item_list = [ 
    {'count': 3.5, 'price': 2500}, 
    {'count': 3, 'price': 400}, 
    {'count': 2, 'price': 3000}, 
    {'count': 3.5, 'price': 750}, 
    {'count': 2, 'price': 500}, 
] 

Теперь давайте карту информации о «тотальных пунктах» и «общей стоимости» в dict называется items_by_count:

for item in item_list: 
    count, price = item['count'], item['price'] 
    items_by_count[count]['total_items'] += 1 
    items_by_count[count]['total_price'] += price 

Но ждать !items_by_count[count] будет кидать KeyError, если count еще не в dict. Это хороший вариант использования для defaultdict. Определим значение по умолчанию для count мы никогда раньше не видели, как 0 общая стоимость и 0 Всего экземпляров:

from collections import defaultdict 
items_by_count = defaultdict(lambda: { 
    'total_items': 0, 
    'total_price': 0 
}) 

Теперь наш код не будет сгенерировано исключение каждый раз, когда мы видим новое значение для count.

Наконец, нам нужно фактически взять среднее. Давайте получим необходимую нам информацию в другом dict, сопоставив подсчет по средней цене.Это хороший случай использования для dict comprehension:

{count: item['total_price']/item['total_items'] 
for count, item in items_by_count.iteritems()} 

Это итерация по items_by_count Dict и создает новый Dict, что мы хотим.

Собираем все вместе:

from collections import defaultdict 

def get_average_price(item_list): 
    items_by_count = defaultdict(lambda: { 
     'total_items': 0, 
     'total_price': 0 
    }) 

    for item in item_list: 
     count, price = item['count'], item['price'] 
     items_by_count[count]['total_items'] += 1 
     items_by_count[count]['total_price'] += price 

    return {count: item['total_price']/item['total_items'] 
      for count, item in items_by_count.iteritems()} 

Если мы переходим в нашем примере ввода Словаре, эта функция возвращает: {3.5: 1625, 2: 1750, 3: 400}

Что мы надеемся, выход вы хотите! Будьте осторожны с gotchas как float division в вашей конкретной версии Python.

+1

Это именно то, что я искал и это сработало отлично! Ты восхитителен! – user7583486

-2

Вы должны перебрать ваши вопросы

See documentation

  • avg(dictionary.values()) вероятно, что вы хотите
+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/15253408) –

+0

Хотя я мог бы помочь просто опубликовать один метод с комментария @phunsukwangdu, а затем поддержать и меня. «простой код». PD: Я отправил постоянную ссылку из официальной документации python. Изменения могут произойти, но удаление такого распространенного метода ... idts –

+0

Я по-прежнему довольно утерян с этим ... Не знаю, как реализовать avg (dictionary.values ​​()) – user7583486