多条件排序其中的两种做法

多条件排序其中的两种做法

本文介绍了两种多条件排序的想法,其实这两种方法类似

思路一

在进行排序时,先按照 条件1 进行排序,再按照 条件2 进行排序

'''以有序的列表list为例'''
table = [
    ['A', 18, 99],
    ['B', 18, 78],
    ['C', 17, 69],
    ['D', 16, 97],
    ['E', 18, 66],
    ['F', 19, 88],
    ['G', 20, 59],
    ['H', 17, 75]
]
'''
这个二维数组分别表示每个学生的姓名、年龄、成绩

现在是按照姓名升序

接下来要按照年龄 升序,再按照 成绩 升序,进行排序

# 理想的结果是
table = [
    ['D', '16', 97],
    ['C', '17', 69],
    ['H', '17', 75],
    ['E', '18', 66],
    ['B', '18', 78],
    ['A', '18', 99],
    ['F', '19', 88],
    ['G', '20', 59]
]
# 使用的排序算法这里不多介绍
# 方法一 以关键属性分类排序
for i in range(len(table)):
    for j in range(i+1, len(table)):
        if (table[i][1] > table[j][1]):
            tmp = table[j]
            table[j] = table[i]
            table[i] = tmp
        '''
        到这满足 按照 年龄 升序
        ['D', 16, 97]
        ['C', 17, 69]
        ['H', 17, 75]
        ['B', 18, 78]
        ['E', 18, 66]
        ['A', 18, 99]
        ['F', 19, 88]
        ['G', 20, 59]
        '''
        if (table[i][1] == table[j][1] and table[i][2] > table[j][2]):
            tmp = table[j]
            table[j] = table[i]
            table[i] = tmp
        '''
        最后按照 成绩 升序
        ['D', 16, 97]
        ['C', 17, 69]
        ['H', 17, 75]
        ['E', 18, 66]
        ['B', 18, 78]
        ['A', 18, 99]
        ['F', 19, 88]
        ['G', 20, 59]
'''

for i in table:
    print(i)

思路二

直接以可能的情况当条件

例如这里需要排序的条件有:

  1. 前面的年龄比后面大
  2. 年龄相同,但是前面的成绩比后面的成绩高
# 方法二 不分类 直接以可能的情况当条件
def cmp(A: list, B: list) -> bool:
    ''' 比大小 '''
    if (A[1] > B[1] or (A[1] == B[1] and A[2] > B[2])):
        # 考虑两种情况
        return True
    return False


for i in range(len(table)):
    for j in range(i+1, len(table)):
        if cmp(table[i], table[j]):  # 是否需要交换位置
            tmp = table[j]
            table[j] = table[i]
            table[i] = tmp


for i in table:
    print(i)

这两种方法都能实现 “按照年龄 升序,再按照 成绩 升序的排序”,应该有更好的办法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值