Объединить массив json, используя общую запись - PullRequest
0 голосов
/ 21 января 2020

У меня есть сценарий python, который использует API Get для предоставления мне двух json массивов

data1

{'result': [
    {'number': '0010041', 'month': 'January'}, 
    {'number': '0010042', 'month': 'March'}
    ]}

data2

{'result': [
    {'task': '0010041', 'time_left': '20 sec'}, 
    {'task': '0010042', 'time_left': '6 min'}
    ]}

I Я хочу объединить эти два элемента, используя общую запись, поэтому в этом случае «число» и «задача», где они совпадают, объединяют остальные данные в массиве.

например.

'number': '0010041', 'month': 'January', 'time_left': '20 sec'
'number': '0010042', 'month': 'March', 'time_left': '6 min'

Как?

Ответы [ 4 ]

2 голосов
/ 21 января 2020

Вот способ использования библиотеки pandas:

import pandas as pd
from pandas.io.json import json_normalize

d1 = json_normalize(d1['result'])
d2 = json_normalize(d2['result'])

# merge the data
lst = d1.merge(d2, left_on='number', right_on='task').drop('task', axis=1)

# converting time to same units (seconds)
lst['time_secs'] = lst['time_left'].str.split().apply(lambda x: int(x[0])*60 if 'min' in x else int(x[0]))

# sort, select cols and convert to dictionary
lst = lst.sort_values('time_secs', ascending=True)[['number','month','time_left']].to_dict(orient='records')

[{'number': '0010041', 'month': 'January', 'time_left': '20 sec'},
 {'number': '0010042', 'month': 'March', 'time_left': '6 min'}]
1 голос
/ 21 января 2020

Это должно сделать работу:

  d1 = data1['result']
  d2 = data2['result']
  merged_list = []
  for item1 in d1:
    for item2 in d2:
      if item1['number'] == item2['task']:
        merged_dict = {**item1, **item2}
        del(merged_dict['task'])
        merged_list.append(merged_dict)

  merged = {
    'result': merged_list
  }
0 голосов
/ 21 января 2020

Вы можете подойти к этому поэлементно:

results = []
for i in range(len(data1['result'])):
    results.append({
        'number': data1[i]['number'],
        'month': data1[i]['month'],
        'time_left': data2[i]['time_left']
    })
0 голосов
/ 21 января 2020

, если список результатов всегда сортируется, может помочь следующий пример:

results = []
for i in range(len(data1['results'])):
   results.append({**data1['results'][i], **data1['results'][i]})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...