首先需要知道,python 对 tuple 的排序规则就是多key排序,对于一个三元组的list用默认的sorted,结果是先按照第一个字段升序,在第一个字段相同的情况下按照第二个字段升序,在前两个字段都相同的情况下按照第三个字段升序。
根据python对元祖的这个排序特性,就可以对对象的多个属性来排序,只需要利用 sorted
的 key
参数,并学会构造元祖来进行排序。
例如 person
是个 list ,每个元素含有 age
和 height
两个数值字段,则先按照年龄升序,再按照身高升序的代码为:
# 注意lambda返回值是一个元祖
sorted(person,key=lambda x: (x.age, x.height))
鉴于对属性甚至其他更加灵活的键进行排序的问题都可以转化为构造元祖,下面我们深入探究下对元祖进行排序的效果。
s = [(1, 3), (3, 1), (5, 2), (2, 4), (0, 0), (0, 2), (1, 2), (1, 4), (3, 4)]
print("第一种:", sorted(s))
print("第二种:", sorted(s, reverse=True))
print("第三种:", sorted(s, key=lambda x: (x[0], x[1])))
print("第四种:", sorted(s, key=lambda x: (x[0], x[1]), reverse=True))
print("第五种:", sorted(s, key=lambda x: (-x[0], x[1])))
print("第六种:", sorted(s, key=lambda x: (x[0], -x[1])))
print("第七种:", sorted(s, key=lambda x: (-x[0], -x[1])))
输出结果为:
第一种: [(0, 0), (0, 2), (1, 2), (1, 3), (1, 4), (2, 4), (3, 1), (3, 4), (5, 2)]
第二种: [(5, 2), (3, 4), (3, 1), (2, 4), (1, 4), (1, 3), (1, 2), (0, 2), (0, 0)]
第三种: [(0, 0), (0, 2), (1, 2), (1, 3), (1, 4), (2, 4), (3, 1), (3, 4), (5, 2)]
第四种: [(5, 2), (3, 4), (3, 1), (2, 4), (1, 4), (1, 3), (1, 2), (0, 2), (0, 0)]
第五种: [(5, 2), (3, 1), (3, 4), (2, 4), (1, 2), (1, 3), (1, 4), (0, 0), (0, 2)]
第六种: [(0, 2), (0, 0), (1, 4), (1, 3), (1, 2), (2, 4), (3, 4), (3, 1), (5, 2)]
第七种: [(5, 2), (3, 4), (3, 1), (2, 4), (1, 4), (1, 3), (1, 2), (0, 2), (0, 0)]
结论:
第一种 = 第三种,
第二种 = 第四种 = 第七种,
如果想按照某些字段升序另外的字段降序,可以使用第五种、第六种的方式