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]