常常遇到這樣的場景,要根據不一樣字段的排序條件,輸出符合要求的列表信息。常常咱們把排序的邏輯寫在sql語句中。現在,我有須要去驗證數據的排序是否符合要求,因此要經過給你的數據,去驗證它的排序邏輯。單個字段的排序還好,若是是多個字段,就會麻煩一些。晚上的思路比較活躍。果果和果媽已熟睡。代碼以下,能夠像sql同樣的order語句,來對數組進行排序。
算是重複造輪子吧。python
#!/usr/bin/python3 import pprint def magic_sort(data=[{}], order="id desc",delimiter=";"): ''' @param data list item is a dict @param order string order like sql "id desc; status asc; field(id,2,-1,1)" @return data list sorted data @todo order by field ''' orderArr = [] for item in order.lower().split(delimiter): if "field" in item: orderArr.append(item.strip()[6:-1].replace(" ","").split(',')) # ['id','2','-1','1'] else: orderArr.append(item.strip().split()) orderArr.reverse() # 先排最後的字段,第一個字段,最後排序 size = len(data) for o in orderArr: key = int(o[0]) if o[0].isdigit() else o[0] # 若是key是數字字符,返回整數 if len(o) < 2: ad = 'asc' elif len(o) == 2: ad = o[1] else: # order by field data = sort_by_field(data,o) continue for i in range(size): for j in range(size-i-1): if (ad == 'desc' and data[j][key] < data[j+1][key]) or (ad == 'asc' and data[j][key] > data[j+1][key]): data[j],data[j+1] = data[j+1],data[j] return data def sort_by_field(data,order): field = order[0] # 字段 sort = order[1:] # 字段的排序 ['1','3','-1'] res = [] last = [] for o in sort: for item in data: if str(item[field]) == o: res.append(item) for item in data: if str(item[field]) not in sort: last.append(item) return res+last def _test_sort(params): for param in params: res = magic_sort(param['data'],param['order']) myprint(res) def myprint(param): pp = pprint.PrettyPrinter(indent=4) pp.pprint(param) if __name__ == '__main__': data = [ {"id":1,"status":3,"age":12}, {"id":2,"status":1,"age":13}, {"id":2,"status":2,"age":14}, {"id":2,"status":3,"age":14}, {"id":4,"status":2,"age":15}, ] order = "id desc; 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 = "0 desc;1 asc;2 desc;3 desc" params.append({"data":ll,"order":llorder}) _test_sort(params)