Pythonでは特定の値や要素の中から最小値、最大値を取得する方法としてmin、max関数があります。
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))
利用方法としては次のような形の方が多いでしょう。下記コードはcode、name、scoreを持つタプルのリストから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式を用いるのも良いでしょう。