经常会遇到这样的场景,需要根据不同字段的排序条件输出符合要求的列表信息。经常我们把排序逻辑写在sql语句中。现在,我需要验证数据的排序是否符合要求,所以我必须通过给你数据来验证它的排序逻辑。单个字段的排序还好,如果是多个字段就比较麻烦了。晚上想得更活跃。果果和果妈已经睡熟了。代码如下,可以像sql一样用order语句对数组进行排序。这就像重新发明轮子一样。#!/usr/bin/python3importpprintdefmagic_sort(data=[{}],order="iddesc",delimiter=";"):'''@paramdata列表项是一个dict@paramorderstringorderlikesql"iddesc;statusasc;field(id,2,-1,1)"@returndatalistsorteddata@todoorderbyfield'''orderArr=[]foriteminorder.lower().split(delimiter):if"field"initem:orderArr.append(item.strip()[6:-1].replace("","").split(','))#['id','2','-1','1']else:orderArr.append(item.strip().split())orderArr.reverse()#先排序最后一个字段,第一个字段,最后排序size=len(data)foroinorderArr:key=int(o[0])ifo[0].isdigit()elseo[0]#如果键是数字字符,返回一个整数iflen(o)<2:ad='asc'eliflen(o)==2:ad=o[1]else:#orderbyfielddata=sort_by_field(data,o)continueforiinrange(size):forjinrange(size-i-1):if(ad=='desc'anddata[j][key]data[j+1][key]):data[j],data[j+1]=data[j+1],data[j]returndatadefsort_by_field(data,order):field=order[0]#字段sort=order[1:]#字段的排序['1','3','-1']res=[]last=[]foroinsort:foritemindata:ifstr(item[field])==o:res.append(item)foritemindata:ifstr(item[field])notinsort:last.append(item)returnres+lastdef_test_sort(params):forparaminparams:res=magic_sort(param['data'],param['order'])myprint(res)defmyprint(param):pp=pprint.PrettyPrinter(indent=4)pp.pprint(param)if__name__=='__main__':data=[{"id":1,"status":3,"age":12},{"id":2,"status":1,"年龄":13},{"id":2,"状态":2,"年龄":14},{"id":2,"status":3,"age":14},{"id":4,"status":2,"age":15},]order="iddesc;field(status,1,3,2)"#order="field(status,1,3,2)"params=[{"data":data,"order":order}]ll=[[1,3,2,5],[3,2,3,5],[3,1,4,3],[2,3,4,2],[3,0,4,1],[5,3,1,5],]llorder="0desc;1asc;2desc;3desc"params.append({"data":ll,"order":llorder})_test_sort(params)
