Search code examples
pythondictionarynested

Python: return nested dict of values


I'm typing 3 list of loops, and I need return dict like in docstring. And it's wrong. How can I solve problem?

For each period you have to count incomes and expenses and total occurrence.

  1. Changes out of functions body are not allowed.
  2. Additional imports are not allowed.
  3. Data could have wholes in periods range ex. 2022-01,2022-03 (missing February), then we assume that item has 0 documents in period

Sample of dict looks like below:

   [
    {
        "package": "FLEXIBLE",
        "created": "2020-03-10T00:00:00",
        "summary": [
            {
                "period": "2019-12",
                "documents": {
                    "incomes": 63,
                    "expenses": 13
                }
            },
            {
                "period": "2020-02",
                "documents": {
                    "incomes": 45,
                    "expenses": 81
                }
            }
        ]
    },
    {
        "package": "ENTERPRISE",
        "created": "2020-03-19T00:00:00",
        "summary": [
            {
                "period": "2020-01",
                "documents": {
                    "incomes": 15,
                    "expenses": 52
                }
            },
            {
                "period": "2020-02",
                "documents": {
                    "incomes": 76,
                    "expenses": 47
                }
            }
        ]
    }
   ]

Code for the task is here:

def task_2(data_in):
    '''
        Return number of documents per period (incomes, expenses, total).
        ex. {
            '2020-04': {
                'incomes': 2480,
                'expenses': 2695,
                'total': 5175
            },
            '2020-05': {
                'incomes': 2673,
                'expenses': 2280,
                'total': 4953
            }
        }
    '''
    period = []
    for term in data_in:
        for dict_val in term['summary']:
            if dict_val['period'] in period:
                continue
            else:
                period.append(dict_val['period'])

    incomes = []
    for term in data_in:
        for dict_val in term['summary']:
            incomes.append(dict_val['documents']['incomes'])

    expenses = []
    for term in data_in:
        for dict_val in term['summary']:
            expenses.append(dict_val['documents']['expenses'])

    # dict_keys = ['incomes', 'expenses', 'total']
    # list1 = [{k: v for k, v in zip(dict_keys, range(len(incomes)))}]

    # return {k: v for k, v in zip(period, list1)}
    return {per: {"incomes": inc, "expenses": exp, "total": inc + exp} for per, inc, exp in
            zip(period, range(len(incomes)), range(len(expenses)))}

I'm typing loops in dict but returns:

{'2019-12': {'incomes': 1, 'expenses': 1, 'total': 2},
 '2020-02': {'incomes': 2, 'expenses': 2, 'total': 4}}

Solution

  • you need to track the period and save income, expenses, total

    data = [
        {
            "package": "FLEXIBLE",
            "created": "2020-03-10T00:00:00",
            "summary": [
                {
                    "period": "2019-12",
                    "documents": {
                        "incomes": 63,
                        "expenses": 13
                    }
                },
                {
                    "period": "2020-02",
                    "documents": {
                        "incomes": 45,
                        "expenses": 81
                    }
                }
            ]
        },
        {
            "package": "ENTERPRISE",
            "created": "2020-03-19T00:00:00",
            "summary": [
                {
                    "period": "2020-01",
                    "documents": {
                        "incomes": 15,
                        "expenses": 52
                    }
                },
                {
                    "period": "2020-02",
                    "documents": {
                        "incomes": 76,
                        "expenses": 47
                    }
                }
            ]}]
    
    
    records = [record for records in data for record in records['summary']  ]
    
    result =  {}
    template = {
            "incomes": 0,
            "expenses": 0,
            "total": 0
        }
    for record in records:
        period = record['period']
        if period not in result:
            result[period] = {"incomes": 0,"expenses": 0,"total": 0}
        income = record['documents']['incomes']
        expense = record['documents']['expenses']
        total = income + expense
    
        result[period]['incomes'] += income
        result[period]['expenses'] += expense
        result[period]['total'] += total
    
    
    print(result)
    
    # output -> {'2019-12': {'incomes': 63, 'expenses': 13, 'total': 76}, '2020-02': {'incomes': 121, 'expenses': 128, 'total': 249}, '2020-01': {'incomes': 15, 'expenses': 52, 'total': 67}}