2015-06-03 75 views
0

我有下列項目列表:的Python:獲得最大的價值對象唯一鍵

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

你能否澄清 「大日」?你的意思是「最近的」? –

+0

按國家分組,然後從該組中取「最大日期」 – Melon

+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'}] 
+0

謝謝你會檢查出來 –

+0

我得到這個錯誤:ValueError:時間數據'%e-%% - %y'與格式'1-Mar-12'不匹配。任何想法爲什麼? –

+0

@Tarun:使用更新的版本;我在第一次修訂中混淆了'strptime()'的參數。 –

0

你可以從1到12,然後分月名稱映射到相應的號碼每個國家的日期屬性( - )並比較日期,月份和年份的數量。

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