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

ヒントはありますか?

アップデート:

endtime が既に日時形式になっている場合はどうなりますか?

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

3 に答える 3

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])
于 2013-10-30T16:34:36.857 に答える
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))
于 2013-10-30T17:02:05.143 に答える