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でのデータ操作がより柔軟で効率的になります。