2016-06-15 2 views
1

최대 실행 날짜의 모든 요소를 ​​해당 코드로 그룹화하여 사전 목록에서 추출하려고합니다. 여기 는 내가 지금까지 무엇을 가지고 있습니다 : 요소 그룹 코드에 의한 목록 그룹의 최대 값 요소

import datetime 
from itertools import groupby 

commission_list = [ 
    {'code': 'COMMISSION_CODE1', 'runningdt': datetime.datetime.strptime('2016-04-12', '%Y-%m-%d'), 'value': 150}, 
    {'code': 'COMMISSION_CODE1', 'runningdt': datetime.datetime.strptime('2016-04-12', '%Y-%m-%d'), 'value': 450}, 
    {'code': 'COMMISSION_CODE1', 'runningdt': datetime.datetime.strptime('2016-04-16', '%Y-%m-%d'), 'value': 140}, 
    {'code': 'COMMISSION_CODE1', 'runningdt': datetime.datetime.strptime('2016-04-17', '%Y-%m-%d'), 'value': 120}, 
    {'code': 'COMMISSION_CODE1', 'runningdt': datetime.datetime.strptime('2016-04-17', '%Y-%m-%d'), 'value': 220}, 

    {'code': 'COMMISSION_CODE2', 'runningdt': datetime.datetime.strptime('2016-04-11', '%Y-%m-%d'), 'value': 150}, 
    {'code': 'COMMISSION_CODE2', 'runningdt': datetime.datetime.strptime('2016-04-15', '%Y-%m-%d'), 'value': 140}, 
    {'code': 'COMMISSION_CODE2', 'runningdt': datetime.datetime.strptime('2016-04-16', '%Y-%m-%d'), 'value': 160}, 
    {'code': 'COMMISSION_CODE2', 'runningdt': datetime.datetime.strptime('2016-04-19', '%Y-%m-%d'), 'value': 210}, 

    {'code': 'COMMISSION_CODE3', 'runningdt': datetime.datetime.strptime('2016-04-16', '%Y-%m-%d'), 'value': 330}, 
    {'code': 'COMMISSION_CODE3', 'runningdt': datetime.datetime.strptime('2016-04-20', '%Y-%m-%d'), 'value': 310}, 
    {'code': 'COMMISSION_CODE3', 'runningdt': datetime.datetime.strptime('2016-04-20', '%Y-%m-%d'), 'value': 410}, 
] 

latest_run_commissions = [] 
for key, commission_group in groupby(commission_list, lambda x: x['code']): 
    tem = list(commission_group) 
    the_last_com = (max(tem, key=lambda x: x['runningdt'])) 
    filtered_objs = filter(lambda f: f['runningdt'] == the_last_com['runningdt'], tem) 
    for o in filtered_objs: 
     latest_run_commissions.append(o) 

for f in latest_run_commissions: 
    print(f) 
print(" ") 

밖에 더 효과적이고 효율적인 방법이 있습니까? 귀하의 조언이나 제안은 많은 것을 환영하고 환영합니다.

답변

0

operator 모듈의 itemgetter을 사용하면 효율적으로 처리 할 수 ​​있습니다.

In [16]: from operator import itemgetter 

In [17]: sorted_data = sorted(commission_list, key=itemgetter('code')) 

In [18]: for g, data in groupby(sorted_data, key=itemgetter('code')): 
    ....:  print(max(data, key=itemgetter('runningdt'))) 
    ....:  
{'runningdt': datetime.datetime(2016, 4, 17, 0, 0), 'code': 'COMMISSION_CODE1', 'value': 120} 
{'runningdt': datetime.datetime(2016, 4, 19, 0, 0), 'code': 'COMMISSION_CODE2', 'value': 210} 
{'runningdt': datetime.datetime(2016, 4, 20, 0, 0), 'code': 'COMMISSION_CODE3', 'value': 310}