简体   繁体   English

列表组中的最大值元素按元素的代码

[英]Max-valued-elements from list group by element's code

I want to extract all elements of the maximum running date grouped by their codes from a list of dictionary. 我想从字典列表中提取由其代码分组的最大运行日期的所有元素。 Here is what I got so far: 这是我到目前为止所得到的:

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(" ")

Are there any more effective and efficient ways out there? 有没有更有效和有效的方法? Your advice or suggestions will be much appreciated and welcomed. 您的建议或建议将受到高度赞赏和欢迎。

You can use itemgetter from the operator module to do this efficiently. 您可以使用operator模块中的itemgetter来有效地执行此operator

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}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM