从字典列表中删除重复的键,仅保留值最大的键值

ric*_*rma 3 python algorithm

从这样的列表中:

mylist = [{'x':2020 , 'y':20},{'x':2020 , 'y':30},{'x':2021 , 'y':10},{'x':2021 , 'y':5}]
Run Code Online (Sandbox Code Playgroud)

我想保持所有“x”唯一,并且“y”是“x”相同的最大值。

我试图将输出获取为:

mylist_unique =  [{'x':2020 , 'y':30},{'x':2021 , 'y':10}]
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

Jan*_*Jan 5

您可以使用 dict 理解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)
Run Code Online (Sandbox Code Playgroud)

这产生

[{'x': 2020, 'y': 30}, {'x': 2021, 'y': 10}]
Run Code Online (Sandbox Code Playgroud)