Python 使用key参数对列表排序
对列表进行排序,先按元组中第2个元素,再按第1个元素指定顺序排序。
介绍几种方法供参考:
def customized_index(list_in: list, element, default: int = 0) -> int:
try:
idx = list_in.index(element)
except ValueError as e:
idx = default
# print('ValueError:', e)
return idx
def demo_sort():
# 对列表进行排序,先按元组中第2个元素,再按第1个元素指定顺序排序
list_a = [('before_disc', 10), ('before_disc', 20), ('before_disc', 30),
('after_disc', 10), ('after_disc', 20), ('after_disc', 30),
('original_price', 10), ('original_price', 20), ('original_price', 30),
('infor', 10), ('infor', 20), ('infor', 30)]
# 方法一:使用列表指定排序顺序,可在列表中指定部分元素的顺序
element_order = ['original_price', 'before_disc', 'after_disc']
dict_order = {k: (i + 1) * 10 for i, k in enumerate(element_order)}
list_a.sort(key=lambda x: (x[1], dict_order.get(x[0], 9999)))
print('\n list_a: \n', list_a)
# 方法二:使用index方法如果查询不到会报错,适用所有排序元素都在列表中
list_a.sort(key=lambda x: (x[1], ['infor', 'before_disc', 'after_disc', 'original_price'].index(x[0])))
print('\n list_a2: \n', list_a)
# 方法三:自定义方法,index查找不到元素则返回默认值
list_a.sort(key=lambda x: (x[1], customized_index(element_order, x[0], -1)))
print('\n list_a3: \n', list_a)
if __name__ == "__main__":
demo_sort()
执行结果:
list_a:
[('original_price', 10), ('before_disc', 10), ('after_disc', 10), ('infor', 10), ('original_price', 20), ('before_disc', 20), ('after_disc', 20), ('infor', 20), ('original_price', 30), ('before_disc', 30), ('after_disc', 30), ('infor', 30)]
list_a2:
[('infor', 10), ('before_disc', 10), ('after_disc', 10), ('original_price', 10), ('infor', 20), ('before_disc', 20), ('after_disc', 20), ('original_price', 20), ('infor', 30), ('before_disc', 30), ('after_disc', 30), ('original_price', 30)]
list_a3:
[('infor', 10), ('original_price', 10), ('before_disc', 10), ('after_disc', 10), ('infor', 20), ('original_price', 20), ('before_disc', 20), ('after_disc', 20), ('infor', 30), ('original_price', 30), ('before_disc', 30), ('after_disc', 30)]