У меня есть вложенный словарь, который содержит данные о книгах:

  • UID
  • Состояние
  • Цена

Вот определение:

books = {
    'uid1':
        {'price': '100',
        'condition': 'good'},
    'uid2':
        {'price': '80',
        'condition': 'fair'},
    'uid3':
        {'price': '150',
        'condition': 'excellent'},
    'uid4':
        {'price': '70',
        'condition': 'fair'},
    'uid5':
        {'price': '180',
        'condition': 'excellent'},
    'uid6':
        {'price': '60',
        'condition': 'fair'}
    }

Мне нужно получить средние цены, сгруппированные по условию. Итак, ожидаемый результат:

{'fair': 70, 'good': 100, 'excellent': 165}

Каков самый питонический способ сделать это?

2
Ildar Akhmetov 21 Авг 2018 в 15:26

4 ответа

Лучший ответ

Я хотел бы ответить на этот вопрос с помощью библиотеки панд.

import pandas as pd
books = {
    'uid1':
        {'price': '100',
        'condition': 'good'},
    'uid2':
        {'price': '80',
        'condition': 'fair'},
    'uid3':
        {'price': '150',
        'condition': 'excellent'},
    'uid4':
        {'price': '70',
        'condition': 'fair'},
    'uid5':
        {'price': '180',
        'condition': 'excellent'},
    'uid6':
        {'price': '60',
        'condition': 'fair'}
   }
data = pd.DataFrame.from_dict(books, orient='index')
data['price'] = data[['price']].apply(pd.to_numeric)
data.groupby(['condition'])['price'].mean()

Вывод:

condition
excellent    165
fair          70
good         100
2
V Sree Harissh 21 Авг 2018 в 12:41

Использование collections.defaultdict

<Сильные> Демо:

from collections import defaultdict

res = defaultdict(list)
for k,v in books.items():
    res[v['condition']].append(int(v['price'])) 

print({k: sum(v)/len(v) for k, v in res.items() })

Вывод:

{'good': 100, 'fair': 70, 'excellent': 165}
3
Rakesh 21 Авг 2018 в 12:32

Я не понимаю, зачем вам defaultdict, за исключением того, что вы не используете Try Except -

for k, v in books.items():
    try:
        avg[v['condition']].append(int(v['price']))
    except KeyError:
        avg[v['condition']] = [int(v['price'])]
avg = {k: sum(v)/len(v) for k, v in avg.items()}
2
Sushant 21 Авг 2018 в 12:42

Вот один из подходов:

from statistics import mean
result = {condition: mean(float(book['price']) for book in books.values() if book['condition'] == condition) for condition in ('fair','good','excellent')}

#result = {'fair': 70.0, 'good': 100.0, 'excellent': 165.0}
2
John Coleman 21 Авг 2018 в 12:41
51948664