【问题标题】:how to merge similar observations by key attributes in json python如何通过json python中的关键属性合并相似的观察
【发布时间】:2020-08-13 22:17:55
【问题描述】:

我在 python 中使用 JSON,这对我来说是新的,我试图通过关键属性合并类似的观察。 JSON 看起来像这样:

tempads=[
['doron-2020-026', ['19.0.1']],
['doron-2020-026', ['18.0.6']],
['doron-2020-023', ['19.0.0']],
['doron-2020-023', ['18.0.5']],
['doron-2020-023', ['17.0.7']]
]

我尝试使用以下方法创建具有独特观察结果的列表:

    for tempad in tempads:
    ads.append(tempad[0])
ads = list(dict.fromkeys(ads))

输出是:

['doron-2020-026', 'doron-2020-023']

然后我尝试查找该列表值并将观察结果添加到它们 但由于某种原因,它只给了我最新的:

for ad in ads:
    for i in range(0,len(tempads)-1):
        if ad==tempads[i][0]:
            ad=[ad,tempads[i][1]]
            newads.append(ad)
print(newads)

[
['doron-2020-026', ['19.0.1']],
['doron-2020-023', ['19.0.0']]
]

【问题讨论】:

    标签: python json


    【解决方案1】:

    看起来你需要一个 groupby。

    使用itertools.groupby。请注意,这仅在列表已排序时才有效。

    例如:

    from itertools import groupby
    
    tempads=[
        ['doron-2020-026', ['19.0.1']],
        ['doron-2020-026', ['18.0.6']],
        ['doron-2020-023', ['19.0.0']],
        ['doron-2020-023', ['18.0.5']],
        ['doron-2020-023', ['17.0.7']]
        ]
    
    result = [[k, [n for _, i in v for n in i]] for k, v in groupby(tempads, lambda x: x[0])]
    print(result)
    

    输出:

    [['doron-2020-026', ['19.0.1', '18.0.6']],
     ['doron-2020-023', ['19.0.0', '18.0.5', '17.0.7']]]
    

    如果列表无序,请使用简单的dict

    例如:

    result = {}
    for k, v in tempads:
        result.setdefault(k, []).extend(v)
    

    输出:

    {'doron-2020-023': ['19.0.0', '18.0.5', '17.0.7'],
     'doron-2020-026': ['19.0.1', '18.0.6']}
    

    【讨论】:

      【解决方案2】:

      您也可以使用defaultdict

      from collections import defaultdict
      
      tempads=[
          ['doron-2020-026', ['19.0.1']],
          ['doron-2020-026', ['18.0.6']],
          ['doron-2020-023', ['19.0.0']],
          ['doron-2020-023', ['18.0.5']],
          ['doron-2020-023', ['17.0.7']]
      ]
      
      d = defaultdict(list)
      
      for key, value in tempads:
          d[key].extend(value)
      
      print(d)
      

      给予:

      defaultdict(<class 'list'>, {
      'doron-2020-026': ['19.0.1', '18.0.6'], 
      'doron-2020-023': ['19.0.0', '18.0.5', '17.0.7']
      })
      

      可以像普通字典一样使用。


      当然你可以把它转换成这样的列表:

      lst = [[k, v] for k, v in d.items()]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 2011-09-30
        相关资源
        最近更新 更多