Pythonでは、リストや他のイテラブルなデータ構造をソートするために sorted 関数を使用します。しかし、デフォルトのソート順序だけでなく、カスタムの比較関数を使用してソート順序を制御することも可能です。

sorted関数と比較関数

Python 3では、sorted関数に比較関数を直接渡すことはできません。しかし、functools.cmp_to_keyを使用することで、比較関数をキーとしてsorted関数に渡すことが可能です。

以下に、整数を文字列として比較してソートする例を示します。

from functools import cmp_to_key

def cmp(a, b):
    if a == b:
        return 0
    return -1 if a < b else 1

def cmpstr(a, b):
    return cmp(str(a), str(b))

def main():
    xs = [4, 90, -9, 12, 42]
    print(sorted(xs, key=cmp_to_key(cmpstr)))

main()

このコードを実行すると、[-9, 12, 4, 42, 90]という結果が得られます。

タプルのリストのソート

次に、2つの要素を持つタプルのリストをソートする例を見てみましょう。比較方法は、タプルの2番目の要素の小さい順、かつ、もし2番目の要素が等しいなら、1番目の要素の大きい順にソートします。

from functools import cmp_to_key

def cmp(a, b):
    if a == b:
        return 0
    return -1 if a < b else 1

def cmptuple(a, b):
    return cmp(a[1], b[1]) or cmp(b[0], a[0])

def main():
    xs = [(4, 90), (-9, 12), (42, 12), (100, 12), (1, 1), (-123, 1)]
    print(sorted(xs, key=cmp_to_key(cmptuple)))

main()

このコードを実行すると、[(1, 1), (-123, 1), (100, 12), (42, 12), (-9, 12), (4, 90)]という結果が得られます。

以上がPythonでのソートと比較関数の基本的な使用方法です。これらの概念を理解し、適切に使用することで、Pythonでのデータ操作がより柔軟で効率的になります。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です