オブジェクト群を何かの値でソートしたいとき、それはともかくAtCoderのレートで先にソートするソート手法。
コード
# coding: utf-8 class Person(): def __init__(self, rate, height, age, name): self.rate = rate # レート self.height = height # 身長 self.age = age # 年齢 self.name = name # 名前 def AtCoderSort(p, key, key_reverse=False): """ (1) ソートしたい属性(key)を指定する (2) レートの高い順にソートする (3) レートが等しい場合、(1)で指定した属性でソートする """ from operator import attrgetter p = sorted(p, key=attrgetter(key), reverse=key_reverse) return sorted(p, key=lambda person: person.rate, reverse=True) def solve(): N = 5 p = [None] * N p[0] = Person(1700, 170, 17, "Alice") p[1] = Person(1000, 170, 18, "Bob") p[2] = Person(2000, 150, 17, "Carol") p[3] = Person(2800, 160, 17, "Eve") p[4] = Person(1000, 150, 17, "Frank") print("--ソート前--") for i in range(N): print("{}, {}, {}, {}".format(p[i].rate, p[i].height, p[i].age, p[i].name)) print("--背の小さい順でAtCoderSortする--") sorted_p = AtCoderSort(p, "height") for i in range(N): print("{}, {}, {}, {}".format(sorted_p[i].rate, sorted_p[i].height, sorted_p[i].age, sorted_p[i].name)) print("--年齢が高い順でAtCoderSortする--") sorted_p = AtCoderSort(p, "age", key_reverse=True) for i in range(N): print("{}, {}, {}, {}".format(sorted_p[i].rate, sorted_p[i].height, sorted_p[i].age, sorted_p[i].name)) if __name__ == "__main__": solve()
結果
--ソート前-- 1700, 170, 17, Alice 1000, 170, 18, Bob 2000, 150, 17, Carol 2800, 160, 17, Eve 1000, 150, 17, Frank --背の小さい順でAtCoderSortする-- 2800, 160, 17, Eve 2000, 150, 17, Carol 1700, 170, 17, Alice 1000, 150, 17, Frank 1000, 170, 18, Bob --年齢が高い順でAtCoderSortする-- 2800, 160, 17, Eve 2000, 150, 17, Carol 1700, 170, 17, Alice 1000, 170, 18, Bob 1000, 150, 17, Frank