多条件排序其中的两种做法
本文介绍了两种多条件排序的想法,其实这两种方法类似
思路一
在进行排序时,先按照 条件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)
思路二
直接以可能的情况当条件
例如这里需要排序的条件有:
- 前面的年龄比后面大
- 年龄相同,但是前面的成绩比后面的成绩高
# 方法二 不分类 直接以可能的情况当条件
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)
这两种方法都能实现 “按照年龄 升序,再按照 成绩 升序的排序”,应该有更好的办法。