我有以下项目清单:
[
{'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'},
]
答案 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'])]