Я признаю, что я не 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.
Тег словаря выглядит как хороший старт - что вы пробовали? – KernelPanic
прост в кодировке! подумайте немного сложнее, вы это сделаете !! :) – phunsukwangdu
Если бы была функция, которая могла бы ** группировать ** элементы ** на ** общий ключ! О, подождите, [есть!] (Https://docs.python.org/3/library/itertools.html?highlight=groupby#itertools.groupby) –