【算法】Python实现字符串数字混合排序 字符串升序数字降序 多维列表排序

本文章使用Python 内置sorted()进行排序。注意sorted()与列表(List)中 .sort()的区别。

字符串排序与数字排序存在差异。

字符串

二维排序

>>> print(sorted(["a1", "a2", "a10"]))
['a1', 'a10', 'a2']  # 有些场景下不是预期的排序结果
>>> print(sorted([1, 2, 10]))
[1, 2, 10]

字符串中,需要按照字母升序,数字升序排序

# 切片中的索引1 注意实际应用中的差异
# 数字已经要转换格式,否则字符串还是字符串排序
>>> print(sorted(["a1", "a2", "a10"], key=lambda x: (x[:1], int(x[1:]))))
['a1', 'a2', 'a10']

此处匿名函数lambda可以使用常规函数进行替换

>>> def func(x):
...     return x[:1], int(x[1:])
...
>>> print(sorted(["a1", "a2", "a10"], key=func))
['a1', 'a2', 'a10']

字符串中,需要按照字母升序,数字降序排序

# 降序使用负数
# 更复杂的逻辑可以在常规函数中进行处理
>>> print(sorted(["a1", "a2", "a10"], key=lambda x: (x[:1], -int(x[1:]))))
['a10', 'a2', 'a1']

三维排序

字符串中,需要按照字母升序,数字降序排序,字母升序

# 降序使用负数
# 更复杂的逻辑可以在常规函数中进行处理
>>> print(sorted(["a1b", "a1a", "a2a", "a10a"], key=lambda x: (x[:1], -int(x[1:-1]), x[-1])))
['a10a', 'a2a', 'a1a', 'a1b']

多维列表 / 列表元素的值

与字符串差异点,字符串采用的是切片,列表使用索引

# 没有处理的默认排序
>>> print(sorted([["a", "1"], ["a", "2"], ["a", "10"]]))
[['a', '1'], ['a', '10'], ['a', '2']]

print(sorted([["a", "1"], ["a", "2"], ["a", "10"]], key=lambda x: (x[0], int(x[1]))))
[['a', '1'], ['a', '2'], ['a', '10']]

应用题来一道
先按照成绩降序排序,相同成绩的按照名字升序排序

data = [
    {'name':'zhangsan', 'score':38},
    {'name':'lisi', 'score':18},
    {'name':'wangwu', 'score':28},
    {'name':'lisan', 'score':28}
]
print(sorted(data, key=lambda x:(-x['score'], x['name'])))

输出结果:

[
    {'name': 'zhangsan', 'score': 38}, 
    {'name': 'lisan', 'score': 28}, 
    {'name': 'wangwu', 'score': 28}, 
    {'name': 'lisi', 'score': 18}
]

更多文章:
Python匿名函数lambda说明及示例 字典数字键排序
Python字典合并 多个字典的之合并为列表示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值