2013-10-30 163 views
0

我有一個字典列表,只需要帶有唯一項目名稱的項目,但只有具有最新結束時間的字典。蟒蛇按鍵排序字典和按另一個鍵排序

如:

query_result = (
{item: 'name1', starttime ='2013-10-29 07:28:14', endtime = '2013-10.29 08:28:14'}, 
{item: 'name1', starttime ='2013-10-29 08:28:14', endtime = '2013-10.29 09:28:14'}, 
{item: 'name1', starttime ='2013-10-29 07:28:14', endtime = '2013-10.29 08:28:14'}, 
{item: 'name2', starttime ='2013-10-29 07:28:14', endtime = '2013-10.29 07:29:14'}, 
{item: 'name2', starttime ='2013-10-29 07:28:14', endtime = '2013-10.29 07:45:14'}, 
{item: 'name2', starttime ='2013-10-29 07:28:14', endtime = '2013-10.29 08:28:14'}) 

所以結果應該是

只有

({item1: 'name1', starttime ='2013-10-29 07:28:14', endtime = '2013-10.29 09:28:14'}, 
{item2: 'name2', starttime ='2013-10-29 07:28:14', endtime = '2013-10.29 08:28:14'}) 

任何提示?

UPDATE:

什麼,如果結束時間是在日期時間格式了嗎?

{item: 'name1', starttime : datetime.datetime(2013, 10, 30, 7, 13, 21), endtime:datetime.datetime(2013, 10, 30, 7, 13, 21} 
+0

我固定的語法不規範。 – Joe

+0

可能重複[在Python中,我如何根據字典的值對字典列表進行排序?](http://stackoverflow.com/questions/72899/in-python-how-do-i-sort-a-list字典的值字典) – Joe

回答

1

我覺得itertools.groupby(iterable[, key])可以幫助這裏。

您可以通過項目組的數據與關鍵item,然後從中挑選所需的項目

used_names = set() 
final_result = [] 
for k, g in itertools.groupby(query_result, key=lambda x: x['item']): 
    final_result.append(sorted(g, key=lambda item: item['endtime'], reverse=True)[0]) 

如果end_time產品字符串應該條狀第一

import datetime 
def endtime_sort_key(item): 
    return datetime.datetime.strptime(item['endtime'], "%Y-%m.%d %H:%M:%S") 

used_names = set() 
final_result = [] 
for k, g in itertools.groupby(query_result, key=lambda x: x['item']): 
    final_result.append(sorted(g, key=endtime_sort_key, reverse=True)[0]) 
+0

感謝oleg,這似乎工作,但endtime關鍵是在日期時間格式已經...任何想法? – krisdigitx

+0

請檢查這個。我已更新解決方案 – oleg

1

排序降序結束時間,然後在第一個每個名字:

import datetime 
def endtime_sort_key(item): 
    return datetime.datetime.strptime(item['endtime'], "%Y-%m.%d %H:%M:%S") 

used_names = set() 
final_result = [] 
for item in sorted(query_result, key=endtime_sort_key, reverse=True): 
    if item['item'] not in used_names: 
     final_result.append(item) 
     used_names.add(item['item']) 
0
from time import strptime 

result = [] 
for i in query_result: 
    tmp = {} 
    for j in (k for k in query_result if k['item'] == i['item']): 
     if strptime(j['endtime'], '%Y-%m.%d %I:%M:%S') > strptime(i['endtime'], '%Y-%m.%d %I:%M:%S'): 
      tmp['item'] = j['item'] 
      tmp['starttime'] = j['starttime'] 
      tmp['endtime'] = j['endtime'] 
    if(tmp and tmp not in result): 
     result.append(tmp) 

result = (tuple(result))