简体   繁体   English

Python - 在字典/json 值中添加多个值

[英]Python - Add multiple values in dictionary / json value

I'm building a python application which receives REST response in below format:我正在构建一个python应用程序,它以以下格式接收 REST 响应:

[
  {
    'metric': 'pass_status',
    'history': [
      {
        'date': '2019-02-20T10:26:52+0000',
        'value': 'OK'
      },
      {
        'date': '2019-03-13T11:37:39+0000',
        'value': 'FAIL'
      },
      {
        'date': '2019-03-13T12:00:57+0000',
        'value': 'OK'
      }
    ]
  },
  {
    'metric': 'bugs',
    'history': [
      {
        'date': '2019-02-20T10:26:52+0000',
        'value': '1'
      },
      {
        'date': '2019-03-13T11:37:39+0000',
        'value': '6'
      },
      {
        'date': '2019-03-13T12:00:57+0000',
        'value': '2'
      }
    ]
  },
  {
    'metric': 'code_smells',
    'history': [
      {
        'date': '2019-02-20T10:26:52+0000',
        'value': '0'
      },
      {
        'date': '2019-03-13T11:37:39+0000',
        'value': '1'
      },
      {
        'date': '2019-03-13T12:00:57+0000',
        'value': '2'
      }
    ]
  }
]

You can see dates are same within for each metric.您可以看到每个指标的日期都相同。 I want to collate this data date-wise, ie my result json/dictionary should look like:我想按日期整理此数据,即我的结果json/dictionary应如下所示:

[
    '2019-02-20T10:26:52+0000' : {
        'pass_status' : 'OK',
        'bugs' : '1',
        'code_smells' : '0'
    },
    '2019-03-13T11:37:39+0000' : {
        'pass_status' : 'FAIL',
        'bugs' : '6',
        'code_smells' : '1'
    },
    '2019-03-13T11:37:39+0000' : {
        'pass_status' : 'OK',
        'bugs' : '2',
        'code_smells' : '2'
    }
]

What will be the suggested approach to do this?建议的方法是什么?

Thanks谢谢

I tried some itertools.groupby magic, but it turned into a mess...我尝试了一些itertools.groupby魔法,但它变成了一团糟......

maybe iteration + defaultdict is just keeping it simple...也许迭代 + defaultdict只是保持简单......

like this:像这样:

from collections import defaultdict

result = defaultdict(dict)

for metric_dict in data:
    metric_name = metric_dict['metric']
    for entry in metric_dict['history']:
        result[entry['date']][metric_name] = entry['value']

print(dict(result))

or a full example with the data:或包含数据的完整示例:

data = [
  {
    'metric': 'pass_status',
    'history': [
      {
        'date': '2019-02-20T10:26:52+0000',
        'value': 'OK'
      },
      {
        'date': '2019-03-13T11:37:39+0000',
        'value': 'FAIL'
      },
      {
        'date': '2019-03-13T12:00:57+0000',
        'value': 'OK'
      }
    ]
  },
  {
    'metric': 'bugs',
    'history': [
      {
        'date': '2019-02-20T10:26:52+0000',
        'value': '1'
      },
      {
        'date': '2019-03-13T11:37:39+0000',
        'value': '6'
      },
      {
        'date': '2019-03-13T12:00:57+0000',
        'value': '2'
      }
    ]
  },
  {
    'metric': 'code_smells',
    'history': [
      {
        'date': '2019-02-20T10:26:52+0000',
        'value': '0'
      },
      {
        'date': '2019-03-13T11:37:39+0000',
        'value': '1'
      },
      {
        'date': '2019-03-13T12:00:57+0000',
        'value': '2'
      }
    ]
  }
]

from collections import defaultdict

result = defaultdict(dict)

for metric_dict in data:
    metric_name = metric_dict['metric']
    for entry in metric_dict['history']:
        result[entry['date']][metric_name] = entry['value']

print(result)


声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM