【发布时间】:2017-03-12 09:36:48
【问题描述】:
我有一个对象列表:带有 id、日期和对象类型的指示。例如
original_list = [{'id':1,'date':'2016-01-01','type':'A'},
{'id':2,'date':'2016-02-01','type':'B'},
{'id':3,'date':'2016-03-01','type':'A'},
{'id':1,'date':'2016-04-01','type':'C'}]
如上所示,此列表可以包含重复的 ID 和不同的日期、类型。现在我想创建一个唯一 ID 列表,其中仅包含最后一个条目(基于日期)。现在我有一个程序如下:
# Create list of unique id's
unique_ids = list(set([foo.get('id') for foo in original_list]))
# find last contact
for unique_id in unique_ids:
foo_same_id = [foo for foo in original_list if foo.get('id') == unique_id]
if len(foo_same_id) == 1:
# use this one
else:
latest_date = [foo.get('date') for foo in foo_same_id]
latest_date = max(latest_date)
latest_object = [foo for foo in foo_same_id if foo.get('date') == latest_date]
在此之后,具有相同 id 的列表按日期排序,并且是用于填写对象类型的 type 的最后一个值。那时我不再需要这些对象,而是复制两个列表(original_list 和 unique_ids)而没有处理过的对象/id。
这似乎可行,但是当应用于 200.000 + 时,它需要很长时间(+ 4 小时)。有没有办法加快这个速度?不同的实现?目前我正在从数据库中读取数据并立即开始处理。
【问题讨论】:
-
显然你应该在数据库级别进行排序!!!
-
是否建议将数据插入到临时表中对该表执行这些操作,然后只读取相关数据?目前不可能在原始查询中执行这些操作。
-
停止一切并阅读有关 WHERE 和 ORDER By 的信息
-
@M.Doe 你能分享你的数据库表的结构或你用来获取这些数据的查询吗?
标签: python python-3.x date dictionary