""" 封装排序: ● 普通类型列表的排序 ● 字典列表的排序 ● 对象列表的排序 """ import operator from collections import Iterable def sortSimpleTypeList(li, reverse=False): """ 排序简单的类型 :param li: :param reverse: :return: """ li.sort() if reverse: li.reverse() return li def sortObjectList(obj_list, by_prop): """ 排序列表:按照对象的某个属性排序 :param obj_list: :param by_prop: :return: """ reverse = False if by_prop.startswith('-'): reverse = True by_prop = by_prop[1:] fun = operator.attrgetter(by_prop) obj_list.sort(key=fun) if reverse: obj_list.reverse() return obj_list def sortDictList(dict_list, by_key): """ 排序字典列表:按照字典的某个key的value排序 :param dict_list: :param by_key: :return: """ reverse = False if by_key.startswith('-'): reverse = True by_key = by_key[1:] dict_list.sort(key=lambda ele: ele[by_key]) if reverse: dict_list.reverse() return dict_list def sortList(li, by=''): """ 排序集合: by加上前缀'-'表示逆序 :param li: 字典集合 or 对象集合 :param by: 通过哪一个属性, name 按照name排序; -name 按照name反向排序 :return: 原对象(排序后集合, 不是返回新集合) """ reverse = False if not li or not isinstance(li, Iterable): # 不是集合, 或空集合返回原内容 return li if by.startswith('-'): reverse = True if isinstance(li[0], (int, float, str)): return sortSimpleTypeList(li, reverse) if not by: # 非简单类型的list, 必须要传入by, 否则不排序 return li if isinstance(li[0], dict): # 如果第一个元素是字典类型,则默认所有元素都是字典类型 return sortDictList(li, by) return sortObjectList(li, by)