ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

AtCoderSort

オブジェクト群を何かの値でソートしたいとき、それはともかく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

参考URL

B: AtCoderでじゃんけんを - AtCoder Regular Contest 048 | AtCoder