python 实现嵌套字典的分组排序

思路:
1.对嵌套字典转换结构。
2.最内层以组为键:{“a”:[],“b”:[]},即对"a","b"排序。外面多少层都可以,递归到组这一层即可。
3.再对组里面的数组,按某个键或者值排序。

def sort_dict(in_result,limit):
	# 最外层的dict几个键,表示分组排序
    position = [i for i in in_result.keys()]
    for pos in position:
    	# 在每个组内,按某个字段排序
        sort_dict = sorted(in_result[pos], key = lambda x:x["b"], reverse = False)
        # 获取第limit个小值,比如前3个最小值,包括重复值
        min_b = sort_dict[0]["b"]
        # 记录非重复个数
        conter = 0
        # 记录重复个数
        index = 0
        # 重复的放进同一个列表中,即filter_result 子列表中
        filter_result = [[] for i in range(limit)]
        for doc in sort_dict:
            if not doc["b"] == min_b:
                min_b = doc["b"]
                conter +=1
                if conter>=limit:
                    break
            # 存储第i小值
            filter_result[conter].append(sort_dict[index])
            index +=1
        io_result.update({pos:filter_result})
    """
    io_result = {'in': [[{'a': 1, 'b': 2}, {'a': 1.1, 'b': 2}], [{'a': 1, 'b': 3}, {'a': 1, 'b': 3}]],
     'out': [[{'a': 1, 'b': 2.1}], [{'a': 1.1, 'b': 3.1}, {'a': 1, 'b': 3.1}]]}
	"""
    # 转换结果,方便写入excel
    result_list = []
    for i in range(limit):
        for pos in position:
            if len(io_result[pos][i])>0:
                result_list.extend(io_result[pos][i])
            else:
                result_list.append(io_result[pos][i])
    return result_list
    
if __name__ == "__main__":
    in_result = {"in":[{"a":1,"b":2},{"a":1.1,"b":2},{"a":1,"b":3},{"a":1,"b":3},{"a":1,"b":4}],
                "out":[{"a":1,"b":2.1},{"a":1.1,"b":3.1},{"a":1,"b":3.1},{"a":1,"b":4.1},{"a":1,"b":5.1}]}
    result = sort_dict(in_result,2)
    print(result)
    """
    [{'a': 1, 'b': 2}, {'a': 1.1, 'b': 2}, {'a': 1, 'b': 2.1}, {'a': 1, 'b': 3}, 
    {'a': 1, 'b': 3}, {'a': 1.1, 'b': 3.1}, {'a': 1, 'b': 3.1}] 
	"""
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值