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

面试题目:

  让所有奇数都在偶数前面,而且奇数升序排列,偶数降序排序,如字符串’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)]
"""

猜你喜欢

转载自blog.csdn.net/weixin_40576010/article/details/88429536