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

时间:2015-06-03 09:05:33

标签: python algorithm list logic

我有以下项目清单:

[
    {'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'}
]

如何仅获取每个国家/地区包含最大日期值的项目,即每个国家/地区返回包含该日期最长的国家/地区的项目。在这种情况下,结果列表将是:

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

3 个答案:

答案 0 :(得分:3)

使用循环并跟踪目前为止每个国家/地区找到的最大值。您必须将这些日期解析为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 :(得分:0)

您可以将月份名称映射到1到12之间的相应数字,然后将每个国家/地区的日期属性拆分为( - ),并比较日,月和年的数字。

答案 2 :(得分:0)

或者在一行中:

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'])]