Python字典列表:获取每天的最后一项
我有一个字典列表,按关键日期排序: 我想得到每天最新的物品,所以在这种情况下:Python字典列表:获取每天的最后一项,python,Python,我有一个字典列表,按关键日期排序: 我想得到每天最新的物品,所以在这种情况下: {'date': datetime.strptime('2016-01-01 23:00', "%Y-%m-%d %H:%M"), 'val': 3}, {'date': datetime.strptime('2016-01-02 23:00', "%Y-%m-%d %H:%M"), 'val': 9}, {'date': datetime.strptime('2016-01-03 21:52', "%Y-%m-%d
{'date': datetime.strptime('2016-01-01 23:00', "%Y-%m-%d %H:%M"), 'val': 3},
{'date': datetime.strptime('2016-01-02 23:00', "%Y-%m-%d %H:%M"), 'val': 9},
{'date': datetime.strptime('2016-01-03 21:52', "%Y-%m-%d %H:%M"), 'val': 37},
我有以下一段代码可以实现这一点:
previous_item = None
wanted_data = []
for index, entry in enumerate(d):
if not previous_item:
previous_item = entry
continue
if entry['date'].date() != previous_item['date'].date():
wanted_data.append(previous_item)
previous_item = entry
#Add as well the last item
if index + 1 == len(d):
wanted_data.append(entry)
但我相信有更好更快的方法来做到这一点。。。而且,这很难看
有没有更像蟒蛇的方法来实现这一点
谢谢 假设数据已按“日期”排序,您可以使用按日期分组,然后从每组中获取最后一项
>>> d = sorted(d, key=lambda x: x["date"]) # only if not already sorted
>>> groups = itertools.groupby(d, lambda x: x["date"].date())
>>> wanted_data = [list(grp)[-1] for key, grp in groups]
>>> wanted_data
[{'date': datetime.datetime(2016, 1, 1, 23, 0), 'val': 3},
{'date': datetime.datetime(2016, 1, 2, 23, 0), 'val': 9},
{'date': datetime.datetime(2016, 1, 3, 21, 52), 'val': 37}]
请注意,这会将每个组展开为一个列表。如果这太昂贵,因为每个日期都有很多条目,您可以创建一个函数,从迭代器中获取最后一个条目,例如使用Python 3中的reduce或functools.reduce:
>>> last = lambda x: functools.reduce(lambda x, y: y, x)
>>> wanted_data = [last(grp) for key, grp in groups]
听起来像是一个代码检查问题,而不是堆栈溢出问题:
>>> last = lambda x: functools.reduce(lambda x, y: y, x)
>>> wanted_data = [last(grp) for key, grp in groups]