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

时间:2019-06-23 15:27:42

标签: python json

我正在构建一个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'
      }
    ]
  }
]

您可以看到每个指标的日期都相同。 我想按日期整理此数据,即我的结果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'
    }
]

建议的方法是什么?

谢谢

1 个答案:

答案 0 :(得分:1)

我尝试了一些itertools.groupby魔术,但结果变得一团糟...

也许迭代+ defaultdict只是保持简单...

像这样:

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))

或包含数据的完整示例:

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)