【问题标题】:Merge json array using using common entry使用通用条目合并 json 数组
【发布时间】:2020-05-06 21:47:21
【问题描述】:

我有一个 python 脚本,它使用 Get API 给我两个 json 数组

数据1

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

数据2

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

我想使用公共条目合并两者,因此在这种情况下,它们相同的“数字”和“任务”合并数组中的其余数据。

例如。

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

怎么做?

【问题讨论】:

    标签: python arrays json merge


    【解决方案1】:

    这是使用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'}]
    

    【讨论】:

    • 这很有效,最后一点我忘了说。那么如何按 time_left 排序,最低优先?
    • 请检查编辑,我假设时间总是在minseconds。如果是以小时为单位,则需要将其转换为秒。
    • 所以假设它在几个小时内......我会怎么做?我很高兴能在几分钟内完成几个小时,所以 1 小时 5 分钟 = 65 分钟。最后一个问题,承诺,
    • 别担心,我已将该条件添加到 API 调用中,以便对 Get 上的数据进行排序。感谢您的帮助。
    【解决方案2】:

    这应该可以完成工作:

      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
      }
    

    【讨论】:

    • 这很神奇,最后一点我忘了说。那么如何按 time_left 排序,最低优先?
    • @TimHannah 请注意,示例中的 'time_left' 使用不同的时间单位,是字符串而不是数字。 “20 sec”应该在“6 min”之前,但“20 min”应该在“6 min”之后,对吧?我认为这个要求值得提出自己的问题。这可能会导致类似this
    【解决方案3】:

    如果结果列表总是排序的,下面的例子会有所帮助:

    results = []
    for i in range(len(data1['results'])):
       results.append({**data1['results'][i], **data1['results'][i]})
    

    【讨论】:

    • 结果的排序并不总是相同的。然而,来自 data1 和 data2 的关于 '0010041' 的信息是关于同一个元素,所以我想使用它并匹配和合并。
    【解决方案4】:

    您可以按元素处理:

    results = []
    for i in range(len(data1['result'])):
        results.append({
            'number': data1[i]['number'],
            'month': data1[i]['month'],
            'time_left': data2[i]['time_left']
        })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2014-10-12
      相关资源
      最近更新 更多