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'])]
我有以下物品清单:
[
{'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'])]