最小値・最大値の取得 (min / max) | Python-izm

最小値・最大値の取得

Pythonでは特定の値や要素の中から最小値最大値を取得する方法としてminmax関数があります。

min

引数には反復可能オブジェクトや個々の値を渡します。

print(min([10, 20, 30, 20, 5, 3]))
print(min('Z', 'A', 'J', 'W'))
3
A

数値の最小値である3が、文字列の最小値(アルファベット順)である‘A’がそれぞれの結果となります。

max

引数はminと同じですが、逆の結果(最大値)が返ります。

print(max([10, 20, 30, 20, 5, 3]))
print(max('Z', 'A', 'J', 'W'))
30
Z

数値の最大値である30が、文字列の最大値(アルファベット順)である‘Z’がそれぞれの結果となります。

key引数

min、max関数にはキーワード引数としてkeyを設定することができます。これはソート時に利用される順序付けの関数を指定することができ、たとえば次のような形で利用することができます。

def key_func(n):
    return int(n)


l = [2, 3, 4, '111']

print(min(l, key=key_func))
print(max(l, key=key_func))
2
111

上記の例では数値と文字列が混在しているリストから最小値、最大値を取得しています。その際、各要素は関数内の処理により数値へ変換してから最小値、最大値を求めます。文字列へ変換した場合はそれぞれの結果も異なります。

def key_func(n):
    return str(n)


l = [2, 3, 4, '111']

print(min(l, key=key_func))
print(max(l, key=key_func))
111
4

なお例示コードの関数内の処理は、値を数値、文字列へ変換するだけの単純なものです。次のようなコードでもまったく同じ処理内容を行うことができます。

l = [2, 3, 4, '111']

print(min(l, key=int))
print(max(l, key=int))

print(min(l, key=str))
print(max(l, key=str))

利用方法としては次のような形の方が多いでしょう。下記コードはcodenamescoreを持つタプルのリストからscoreで最小のもの、最大のものを取得しています。

def key_func(n):
    return n[2]


# code / name / score
l = [(1, 'Python', 100), (2, 'Ruby', 80), (3, 'Perl', 40)]

print(min(l, key=key_func))
print(max(l, key=key_func))
(3, 'Perl', 40)
(1, 'Python', 100)

クラス内のscore属性で最小値、最大値を求める場合は次のようにします。

def key_func(n):
    return n.score


class TestClass:

    def __init__(self, code, name, score):
        self.code = code
        self.name = name
        self.score = score

    def __str__(self):
        return '({}, {}, {})'.format(self.code, self.name, self.score)


l = [
    TestClass(1, 'Python', 100),
    TestClass(2, 'Ruby', 80),
    TestClass(3, 'Perl', 40)
]

print(min(l, key=key_func))
print(max(l, key=key_func))
(3, Perl, 40)
(1, Python, 100)

このようにkeyとして指定する関数は短い処理になりがちです。そういった場合はlambda式を用いるのも良いでしょう。