python多字段,混合排序

利用队列来实现,可以满足任意多个字段,任意升序和降序的排序的场景,比如“按照a字段升序,b字段降序,c字段升序”

sort_feild_array的格式为:

[{"balance_time": "desc"}, {"bk_id": "asc"}, {"trans_id": "desc"}]

asc升序
desc降序

unsorted_list的格式为:

 unsorted_list={'1':{"balance_time":12344,"bk_id":45646,"trans_id":78940},'2':{"balance_time":12344,"bk_id":45647,"trans_id":78941},'3':{"balance_time":12344,"bk_id":45648,"trans_id":78942},'4':{"balance_time":12345,"bk_id":45642,"trans_id":78943},'5':{"balance_time":12345,"bk_id":45641,"trans_id":78944},'6':{"balance_time":12345,"bk_id":45640,"trans_id":78944},'7':{"balance_time":12346,"bk_id":"45649","trans_id":78944},'8':{"balance_time":12346,"bk_id":45648,"trans_id":78941},'9':{"balance_time":12346,"bk_id":45647,"trans_id":78941}}

具体实现:

    def comprex_sort_index_list(self,sort_feild_array,unsorted_list):
        sort_item_queue= Queue.Queue()
        sort_item_queue.put(unsorted_list)
        for sort in sort_feild_array:
            sort_item_queue_temp = Queue.Queue()
            sort_feild=sort.keys()[0]
            is_reverse=True if sort[sort_feild]=="desc" else False
            while not sort_item_queue.empty():
                queue_item=sort_item_queue.get()
                if isinstance(queue_item,dict):
                    queue_item = tuple(queue_item.items())
                result_sort=sorted(queue_item,key=lambda x:x[1][sort_feild],reverse=is_reverse)
                sort_feild_value_dictinct=sorted(list(set(map(lambda x:x[1][sort_feild],result_sort))),reverse=is_reverse)
                for feild_value in sort_feild_value_dictinct:
                    sort_item_queue_temp.put(filter(lambda x:x[1][sort_feild]==feild_value,result_sort))

            sort_item_queue=sort_item_queue_temp
        sorted_list=list()
        while not sort_item_queue.empty():
            sorted_list=sorted_list+sort_item_queue.get()
        return sorted_list
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值