Skip to main content
 首页 » 编程设计

python之基于 2 个键删除字典列表中的重复字典

2025年05月04日13zhujiabin

我有一个字典列表,如下所示:

   my_list = [{'key1':'1', 'date':'2015-01-09'}, {'key1':'3', 'date':'2015-01-09'}, {'key1':'1', 'date':'2014-03-19'}, \ 
       {'key1':'4', 'date':'2015-05-09'} ,...] 

在某些字典中,key1 的值重复,我想根据日期(字典的另一个键)从列表中删除它们,只保留最早日期的字典。 结果:

    my_list = [{'key1':'3', 'date':'2015-01-09'}, {'key1':'1', 'date':'2014-03-19'}, {'key1':'4', 'date':'2015-05-09'} ,...] 

性能很重要。

请您参考如下方法:

我会用 key1 重建一个字典作为字典理解的键,使用排序值(反向)所以最后返回最早的日期,覆盖相同的键:只保留最早的日期:

my_list = [{'key1':'1', 'date':'2015-01-09'}, {'key1':'3', 'date':'2015-01-09'}, {'key1':'1', 'date':'2014-03-19'}, \ 
       {'key1':'4', 'date':'2015-05-09'}] 
 
my_dict = {d["key1"]:d for d in sorted(my_list,key=lambda l:l["date"],reverse=True)} 
 
print(list(my_dict.values())) 

结果(我认为排序无关紧要,否则我不能使用字典,因为没有保留顺序):

[{'key1': '1', 'date': '2014-03-19'}, {'key1': '3', 'date': '2015-01-09'}, {'key1': '4', 'date': '2015-05-09'}] 

(请注意,按字典顺序对日期进行排序是可以的,因为它们是 YYYY-MM-DD 格式,它使事情变得更容易:无需解析日期)

如果您的内存不足,另一种解决方案是避免排序部分,因为它会预先创建列表的排序副本(不会复制数据,但仍然会占用一些内存)。

在那种情况下,经典循环就可以了,速度较慢但内存消耗较少(并且不需要排序)。使用带有默认值的 get 返回 'A' 当键不在目标字典中强制插入(A 排名高于任何数字)。

my_dict = {} 
 
for l in my_list: 
    k = l['key1'] 
    d = l['date'] 
 
    if my_dict.get(k,'A') > d: 
        my_dict[k] = d