Python 使用key参数对列表排序

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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值