【问题标题】:Removing duplicate keys from list of dictionary, keep only that key-value where value is maximum从字典列表中删除重复键,只保留值最大的键值
【发布时间】:2020-09-17 16:55:29
【问题描述】:

来自类似的列表:

mylist = [{'x':2020 , 'y':20},{'x':2020 , 'y':30},{'x':2021 , 'y':10},{'x':2021 , 'y':5}]

我想保持所有 'x' 的唯一性和 'y' 是最大的 'x' 是相同的。

我正在尝试将输出设为:

mylist_unique =  [{'x':2020 , 'y':30},{'x':2021 , 'y':10}]

我以一种非常天真的方式实现了它:

res =[]
temp = {}
print(len(temp))

for i in range(len(mylist)):
    print(mylist[i])
    for k,v in mylist[i].items():
        print(mylist[i]['x'],temp.keys(),mylist[i]['y'])
        if mylist[i]['x'] not in temp.keys() or mylist[i]['y'] > (temp[mylist[i]['x']]) :
            print(k)
            temp.update({mylist[i]['x']:mylist[i]['y']})

print(temp)
for k,v in temp.items():
    res.append({'x':k,'y':v})
print(res)

【问题讨论】:

    标签: python algorithm


    【解决方案1】:

    您可以将字典理解与itertools.groupby 一起使用:

    from itertools import groupby
    
    mylist = [{'x': 2020, 'y': 20}, {'x': 2020, 'y': 30}, {'x': 2021, 'y': 10}, {'x': 2021, 'y': 5}]
    
    mylist_unique = [{'x': key, 'y': max(item['y'] for item in values)}
                     for key, values in groupby(mylist, lambda dct: dct['x'])]
    print(mylist_unique)
    

    这会产生

    [{'x': 2020, 'y': 30}, {'x': 2021, 'y': 10}]
    

    【讨论】:

    • 什么是 lambda dct: dct['x'])
    • @richaverma:这就是 groupby 的工作方式。您可以为其提供一个键函数,该函数根据键累积值(在您的示例中 x 来自列表中的每个字典)。
    • @richaverma 关键字lambda 用于定义匿名内联函数。 groupby 的第二个参数必须是函数。您可以通过编写def function_for_groupby(dct): return dct['x']groupby(mylist, function_for_groupby) 来预先定义该函数,或者您可以使用lambda 内联定义函数而不给它一个名称。另见:stackoverflow.com/questions/5233508/…
    • 函数调用时传入的参数是什么?
    【解决方案2】:

    试试这段代码,应该能满足你的要求:

    ht = dict()
    for elem in mylist:
        if elem['x'] in ht:
            ht[elem['x']] = max(ht[elem['x']],elem['y'])
        else:
            ht[elem['x']]=elem['y']
    
    mylist_unique=[]
    
    for key in ht:
        mylist_unique.append({'x':key,'y':ht[key]})
    

    【讨论】:

      【解决方案3】:

      一个简单的 groupby 应该适合你,因为你想要唯一的 x 我们在 x 上 groupby 然后找到 y 的最大值

      import itertools
      mylist = [{'x':2020 , 'y':20},{'x':2020 , 'y':30},{'x':2021 , 'y':10},{'x':2021 , 'y':5}]
      mylist1=[]
      for key, group in itertools.groupby(mylist,lambda x:x["x"]):
          max_y=0
          for thing in group:
              max_y=max(max_y,thing["y"])
          mylist1.append({"x":key,"y":max_y})
      print(mylist1)
      

      【讨论】:

        【解决方案4】:

        你可以在一行中使用 map 和 groupby 来做到这一点:

        from itertools import groupby
        
        list(map(lambda a:{'x':a[0], 'y':max(map(lambda b: b['y'], a[1]))}, groupby(mylist, lambda c: c['x'])))
        

        这会产生

        [{'x': 2020, 'y': 30}, {'x': 2021, 'y': 10}]
        

        【讨论】:

          猜你喜欢
          • 2021-08-09
          • 2021-12-29
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多