利用sorted函数实现一个列表俩种排列方式

本文介绍了一种高效的算法,用于将数字序列中的奇数按升序排列在前,偶数按降序排列在后。通过使用Python的sorted函数和lambda表达式,实现了简洁的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试题目:

  让所有奇数都在偶数前面,而且奇数升序排列,偶数降序排序,如字符串’1982376455’,变成’1355798642’

答案:

这个题目解法很多种,不过这种解法代码最少

test_str = '1982376455'
def func(l):
    print("".join(sorted(l, key=lambda x: int(x) % 2 == 0 and 20 - int(x) or int(x))))
func(test_str)
"""
结果:“1355798642"
"""
解析:

20-偶数,奇数不变
难点在于key = lambda x : int(x) % 2 == 0 and 20 - int(x) or int(x)
意思就是对与列表中每个元素,判断x是不是偶数,如果是就用20 - x ,所得到的值,来执行从小到大排序,如果是奇数就不变。
 
理解这个就行:原值的顺序,根据lambda后的值的大小对应的顺序是一样的,比如原值8对应的位置是20 -8 = 12所在的位置。
 


科普:

  在sorted函数中,如果key的值是元组,会先根据元组第一元素排序后,再根据第二个元素排序**

test_str = {"a":1, "b":2, "z":6, "i":2, "k":6,"s":3,"l":2, "y":6}
print(sorted(test_str.items(), key = lambda x : (x[1], x[0])))
"""
结果为:
[('a', 1),
 ('b', 2),
 ('i', 2),
 ('l', 2),
 ('s', 3),
 ('k', 6),
 ('y', 6),
 ('z', 6)]
"""
print(sorted(test_str.items(), key = lambda x : (x[1])))
"""
结果:
[('a', 1),
 ('b', 2),
 ('i', 2),
 ('l', 2),
 ('s', 3),
 ('z', 6),
 ('k', 6),
 ('y', 6)]
"""

分析: 通过对比返现,key = lambda x :(x[1], x[0]), 会变按照数字从小到达排序,然后在相等数字的地方按照字符从小到大排序。在key = lambda x :x[1]中,由于sorted是稳定排序,所以数字一样的时候,出现在前面的,排序时候就在前面
 

小技巧:
  1. 如果想要排序方法为从小到大的,对于x[1]这种数字类型,直接在前面加个负号就可以

 print(sorted(test_str.items(), key = lambda x : (-x[1], x[0])))
 """
 结果:
 [('k', 6),
 ('y', 6),
 ('z', 6),
 ('s', 3),
 ('b', 2),
 ('i', 2),
 ('l', 2),
 ('a', 1)]
 """

  对于字符的,可以巧妙利用ord()函数获取ASCII码上字符对应的位置来排序

print( sorted(test_str.items(), key = lambda x : (-x[1],ord("Z")- ord(x[0]))))
"""
结果:
[('z', 6),
 ('y', 6),
 ('k', 6),
 ('s', 3),
 ('l', 2),
 ('i', 2),
 ('b', 2),
 ('a', 1)]
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值