fork download
  1. from collections import defaultdict
  2. from json import dumps
  3. from pprint import pprint
  4.  
  5. last_data = [{'country': 'USA', 'cases': 10425, 'deaths': 1704, 'recovered': 2525, 'active': 100027},
  6. {'country': 'Australia', 'cases': 3045, 'deaths': 1704, 'recovered': 2525, 'active': 100027},
  7. {'country': 'Germany', 'cases': 6025, 'deaths': 1704, 'recovered': 2525, 'active': 100027}]
  8.  
  9. current_data = [{'country': 'USA', 'cases': 10425, 'deaths': 1704, 'recovered': 2525, 'active': 100027},
  10. {'country': 'Australia', 'cases': 3046, 'deaths': 1704, 'recovered': 2525, 'active': 100028},
  11. {'country': 'Germany', 'cases': 6026, 'deaths': 1706, 'recovered': 2525, 'active': 100026}]
  12.  
  13. def list_dicts_to_nested_dict(key, lst):
  14. return {dic[key]: {k: v for k, v in dic.items() if k != key} for dic in lst}
  15.  
  16. def defaultdict_to_dict(df):
  17. result = {}
  18. for k, v in df.items():
  19. if isinstance(v, defaultdict):
  20. result[k] = dict(v)
  21. defaultdict_to_dict(v)
  22. return dict(result)
  23.  
  24.  
  25. last_data_dict = list_dicts_to_nested_dict('country', last_data)
  26. current_data_dict = list_dicts_to_nested_dict('country', current_data)
  27.  
  28. result = defaultdict(lambda: defaultdict(dict))
  29. for country in last_data_dict.keys() & current_data_dict.keys():
  30. if last_data_dict[country] != current_data_dict[country]:
  31. for key in last_data_dict[country].keys() & current_data_dict[country].keys():
  32. change = current_data_dict[country][key] - last_data_dict[country][key]
  33. if change != 0:
  34. result[country][key][f"last_{key}_value"] = last_data_dict[country][key]
  35. result[country][key][f"updated_{key}_value"] = current_data_dict[country][key]
  36. result[country][key]["change"] = change
  37.  
  38. print('Normal Defaultdict Output:')
  39. print(result)
  40.  
  41. print('JSON Defaultdict Output:')
  42. print(dumps(result, indent=4))
  43.  
  44. print('Non-Defaultdict Output:')
  45. pprint(defaultdict_to_dict(result))
Success #stdin #stdout 0.03s 9748KB
stdin
Standard input is empty
stdout
Normal Defaultdict Output:
defaultdict(<function <lambda> at 0x2ac7d94b58c8>, {'Australia': defaultdict(<class 'dict'>, {'cases': {'last_cases_value': 3045, 'updated_cases_value': 3046, 'change': 1}, 'active': {'last_active_value': 100027, 'updated_active_value': 100028, 'change': 1}}), 'Germany': defaultdict(<class 'dict'>, {'cases': {'last_cases_value': 6025, 'updated_cases_value': 6026, 'change': 1}, 'active': {'last_active_value': 100027, 'updated_active_value': 100026, 'change': -1}, 'deaths': {'last_deaths_value': 1704, 'updated_deaths_value': 1706, 'change': 2}})})
JSON Defaultdict Output:
{
    "Australia": {
        "cases": {
            "last_cases_value": 3045,
            "updated_cases_value": 3046,
            "change": 1
        },
        "active": {
            "last_active_value": 100027,
            "updated_active_value": 100028,
            "change": 1
        }
    },
    "Germany": {
        "cases": {
            "last_cases_value": 6025,
            "updated_cases_value": 6026,
            "change": 1
        },
        "active": {
            "last_active_value": 100027,
            "updated_active_value": 100026,
            "change": -1
        },
        "deaths": {
            "last_deaths_value": 1704,
            "updated_deaths_value": 1706,
            "change": 2
        }
    }
}
Non-Defaultdict Output:
{'Australia': {'active': {'change': 1,
                          'last_active_value': 100027,
                          'updated_active_value': 100028},
               'cases': {'change': 1,
                         'last_cases_value': 3045,
                         'updated_cases_value': 3046}},
 'Germany': {'active': {'change': -1,
                        'last_active_value': 100027,
                        'updated_active_value': 100026},
             'cases': {'change': 1,
                       'last_cases_value': 6025,
                       'updated_cases_value': 6026},
             'deaths': {'change': 2,
                        'last_deaths_value': 1704,
                        'updated_deaths_value': 1706}}}