基于值的字典列表中的不同行

时间:2016-09-28 20:35:07

标签: python

我在 sampleInputDbData

下面有这个示例输入
def sampleInputDbData( self ):
    return \
    [
        {'FundCode': 300, 'FundName': 'First Fund', 'ProdStartDate': dt(2016,7,3,4,5,6), 'ProdEndDate': dt(2016,8,3,4,5,6), 'FundFee': 100},
        {'FundCode': 300, 'FundName': 'First Fund', 'ProdStartDate': dt(2016,8,3,4,5,6), 'ProdEndDate': dt(2016,8,3,6,5,6), 'FundFee': 101 },
        {'FundCode': 300, 'FundName': 'First Fund', 'ProdStartDate': dt(2016,8,3,6,5,6), 'ProdEndDate': dt(2016,8,15,6,5,6), 'FundFee': 102 },
        {'FundCode': 301, 'FundName': 'Second Fund', 'ProdStartDate': dt(2016,7,3,4,5,6), 'ProdEndDate': dt(2016,8,3,6,5,6), 'FundFee': 110},
        {'FundCode': 301, 'FundName': 'Second Fund', 'ProdStartDate': dt(2016,8,3,6,5,6), 'ProdEndDate':  dt(2016,8,15,6,5,6), 'FundFee': 111},
        {'FundCode': 302, 'FundName': 'Third Fund', 'ProdStartDate': dt(2016,8,3,6,5,6), 'ProdEndDate':  dt(2016,8,15,6,5,6), 'FundFee': 120},
    ]

我想要的是 sampleOutputDbData 作为输出

def sampleOutputDbData( self ):
    return \
    [
        {'FundCode': 300, 'FundName': 'First Fund', 'ProdStartDate': dt(2016,8,3,6,5,6), 'ProdEndDate': dt(2016,8,15,6,5,6), 'FundFee': 102 },
        {'FundCode': 301, 'FundName': 'Second Fund', 'ProdStartDate': dt(2016,8,3,6,5,6), 'ProdEndDate':  dt(2016,8,15,6,5,6), 'FundFee': 111},
        {'FundCode': 302, 'FundName': 'Third Fund', 'ProdStartDate': dt(2016,8,3,6,5,6), 'ProdEndDate':  dt(2016,8,15,6,5,6), 'FundFee': 120},
    ]

决定因素基本上是:根据密钥 ProdEndDate 的最大值获取所有唯一 FundCode 。 dt是类型日期时间

1 个答案:

答案 0 :(得分:0)

这有效:

from collections import defaultdict
from operator import itemgetter

code_dict = defaultdict(list)
for d in sampleInputDbData:
    code_dict[d["FundCode"]].append(d)

output_data = [max(d, key=itemgetter("ProdEndDate")) for d in code_dict.values()]

我首先创建一个默认的dict,用于FundCode的临时排序。每个密钥都将包含一个列表,其中所有dicts具有相同的FundCode。然后,我从每个列表中取出最后一个ProdEndDate