Python: 获取唯一键的最大值对象

Python: get maximum value object for unique key

我有以下物品清单:

[
    {'country' : 'India', 'date' : '18-Mar-14'},
    {'country' : 'India', 'date' : '18-Apr-14'},
    {'country' : 'India', 'date' : '18-May-14'},
    {'country' : 'Australia', 'date' : '18-Mar-14'},
    {'country' : 'Australia', 'date' : '18-Apr-14'},
    {'country' : 'Australia', 'date' : '18-May-14'},
    {'country' : 'China', 'date' : '18-Mar-14'},
    {'country' : 'China', 'date' : '18-Apr-14'},
    {'country' : 'China', 'date' : '18-May-14'}
]

我怎样才能只获得那些包含每个国家/地区最大日期值的项目,即对于每个国家/地区,它 returns 包含该国家/地区的日期最大的项目。在这种情况下,结果列表将是:

[
    {'country' : 'India', 'date' : '18-May-14'},
    {'country' : 'Australia', 'date' : '18-May-14'},
    {'country' : 'China', 'date' : '18-May-14'},
]

使用循环并跟踪迄今为止每个国家/地区找到的最大值。您必须将这些日期解析为 datetime 个对象,以便您可以轻松地比较它们:

from datetime import datetime

max_dates = {}
for entry in list_of_dicts:
    date = datetime.strptime(entry['date'], '%d-%b-%y')
    country = entry['country']
    if country not in max_dates or date > max_dates[country][0]:
        max_dates[country] = (date, entry)

result = [entry for date, entry in max_dates.values()]

演示:

>>> from datetime import datetime
>>> list_of_dicts = [
...     {'country' : 'India', 'date' : '18-Mar-14'},
...     {'country' : 'India', 'date' : '18-Apr-14'},
...     {'country' : 'India', 'date' : '18-May-14'},
...     {'country' : 'Australia', 'date' : '18-Mar-14'},
...     {'country' : 'Australia', 'date' : '18-Apr-14'},
...     {'country' : 'Australia', 'date' : '18-May-14'},
...     {'country' : 'China', 'date' : '18-Mar-14'},
...     {'country' : 'China', 'date' : '18-Apr-14'},
...     {'country' : 'China', 'date' : '18-May-14'}
... ]
>>> max_dates = {}
>>> for entry in list_of_dicts:
...     date = datetime.strptime(entry['date'], '%d-%b-%y')
...     country = entry['country']
...     if country not in max_dates or date > max_dates[country][0]:
...         max_dates[country] = (date, entry)
... 
>>> [entry for date, entry in max_dates.values()]
[{'date': '18-May-14', 'country': 'China'}, {'date': '18-May-14', 'country': 'Australia'}, {'date': '18-May-14', 'country': 'India'}]

你可以将月份名称映射到1到12对应的数字,然后用(-)分割每个国家的日期属性,比较日月年的数字。

或一行:

from itertools import groupby
from datetime import datetime

[(x,max(y,key=lambda o:datetime.strptime(o['date'], '%d-%b-%y'))) for x,y in groupby(sorted(t, key=lambda o: o['country']), key=lambda o: o['country'])]