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)
表现很重要.
我将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)