81 lines
2.0 KiB
Python
81 lines
2.0 KiB
Python
![]() |
"""
|
||
|
封装排序:
|
||
|
● 普通类型列表的排序
|
||
|
● 字典列表的排序
|
||
|
● 对象列表的排序
|
||
|
"""
|
||
|
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)
|