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

G. *_*ak. 1 python dictionary list duplicates

我有一个字典列表,像这样:

   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'} ,...]
Run Code Online (Sandbox Code Playgroud)

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

    my_list = [{'key1':'3', 'date':'2015-01-09'}, {'key1':'1', 'date':'2014-03-19'}, {'key1':'4', 'date':'2015-05-09'} ,...]
Run Code Online (Sandbox Code Playgroud)

表现很重要.

Jea*_*bre 5

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

结果(我认为排序没关系,否则我不能使用字典,因为订单没有保留):

[{'key1': '1', 'date': '2014-03-19'}, {'key1': '3', 'date': '2015-01-09'}, {'key1': '4', 'date': '2015-05-09'}]
Run Code Online (Sandbox Code Playgroud)

(请注意,使用字典顺序对日期进行排序是正常的,因为它们是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
Run Code Online (Sandbox Code Playgroud)