end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

python3 における sort関数による並び替え

javascript と perl のそれぞれで、sort関数による並び替え - end0tknr's kipple - web写経開発

随分昔に、記載した上記javascript & perl に対するpython 版。

以下。

ポイントは、sortted()内に記載した「from functools import cmp_to_key」 と「key=cmp_to_key」

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

from functools import cmp_to_key
import pprint


def main():

    org_elms = [
        {"name":"tanaka","pos":{"line": 1,"col":10}},
        {"name":"suzuki","pos":{"line": 5,"col": 5}},
        {"name":"yamada","pos":{"line": 5,"col":10}},
        {"name":"sato",  "pos":{"line":10,"col":10}}
    ]

    sorted_elms = sorted(org_elms, key=cmp_to_key(my_sort) )
    
    print(pprint.pformat(sorted_elms, width=80))
    
    
def my_sort(elm1,elm2):
    print(elm1["pos"]["line"], elm2["pos"]["line"])

    if elm1["pos"]["line"] < elm2["pos"]["line"]:
        return -1
    elif elm1["pos"]["line"] > elm2["pos"]["line"]:
        return 1
    
    if elm1["pos"]["col"] < elm2["pos"]["col"]:
        return -1
    elif elm1["pos"]["col"] > elm2["pos"]["col"]:
        return 1
    
    if elm1["name"] < elm2["name"]:
        return -1
    elif elm1["name"] > elm2["name"]:
        return 1
    
    return 0

if __name__ == '__main__':
    main()

hashmapをsortする場合も、ほぼ同様で、違いは、 呼び出し時に「.items()」を追加する程度です

sorted_access_summary = sorted(access_summary.items(), key=cmp_to_key(my_sort) )

def my_sort(elm1,elm2):
    if elm1[1] < elm2[1]:
        return -1
    elif elm1[1] > elm2[1]:
        return 1
    
    return 0