TransWikia.com

Сгруппировать и найти среднее по словарю

Stack Overflow на русском Asked on November 10, 2021

import json
def age_count(x):
    s = ('{ "workers": [{"name": "Имя1", "age": 34, "occupation": "Программист"}, {"name": "Имя2", "age": 24, "occupation": "Программист"}, {"name": "Имя3", "age": 40, "occupation": "Грузчик"} ] }')
    
    
    r = {}
    for x in json.loads(s)['workers'] :
    
    r.setdefault(x["occupation"],[]).append(x["age"])
    for x in r.keys() :
    
    r[x] = sum(r[x])/len(r[x])
    print(r)
    
    
with open("input.txt") as f:
    age_count(f.read())

Условия:
Напишите функцию age_count, которая принимает JSON строку следующего вида:

{ "workers": [{"name": "Имя1", "age": 34, "occupation": "Программист"}, {"name": "Имя2", "age": 24, "occupation": "Программист"}, {"name": "Имя3", "age": 40, "occupation": "Грузчик"} ] }

Далее, в функции нужно посчитать средний возраст по каждой из профессий и сохранить в файл age.json этот возраст в следующем виде:

{"Программист": 29.0, "Грузчик": 40.0}

Также результирующий JSON должен быть выведен на экран в конце выполнения функции.

Для проверки задания после описания функции добавьте следующие строки:

with open("input.txt") as f:
    age_count(f.read())

Формат ввода (содержимое input.txt)

{
    "workers": [
         {
            "name": "Имя1",
            "age": 34,
            "occupation": "Программист"
        }, {
            "name": "Имя2",
            "age": 24,
            "occupation": "Программист"
        }, {
            "name": "Имя3",
            "age": 40,
            "occupation": "Грузчик"
        }
    ]
}

Формат вывода:

{"Программист": 29.0, "Грузчик": 40.0}

2 Answers

Попробуйте так:

from itertools import groupby

def avg(lst):
    return sum(lst) / len(lst)

data = json.loads(s)

res = {a:avg([z["age"] for z in b]) 
       for a,b in groupby(data['workers'], key=lambda x: x['occupation'])}

результат:

In [67]: res
Out[67]: {'Программист': 29.0, 'Грузчик': 40.0}

Answered by MaxU on November 10, 2021

import json


def age_count(data):
    s = json.loads(data)

    r = dict()
    employees = s['workers']

    for employee in employees:
        if employee['occupation'] not in r:
            r[employee['occupation']] = {
                'summary_age': 0,
                'employees_qty': 0
            }
        r[employee['occupation']]['summary_age'] += employee['age']
        r[employee['occupation']]['employees_qty'] += 1

    json.dump(
        {
            occupation: r[occupation]['summary_age'] / r[occupation]['employees_qty'] for occupation in r
        }, 
        open('age.json', 'w', encoding='utf-8'),
        ensure_ascii=False
    )


with open("input.txt", 'r', encoding='utf-8') as f:
    age_count(f.read())

check = json.load(open('age.json', 'r', encoding='utf-8'))
print(check)
# {'Программист': 29.0, 'Грузчик': 40.0}

Содержимое input.txt:

{
    "workers": [{
            "name": "Имя1",
            "age": 34,
            "occupation": "Программист"
        }, {
            "name": "Имя2",
            "age": 24,
            "occupation": "Программист"
        }, {
            "name": "Имя3",
            "age": 40,
            "occupation": "Грузчик"
        }
    ]
}

Answered by Namerek on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP