min
このページでは豊富な例を用いてPythonのmin関数の使い方を学ぶことができます。
minはPythonの組み込み関数で、引数として与えた反復可能(iterable)オブジェクトの要素の中で最小となる値を戻り値として返します。 引数として2つ以上の位置引数を与え、その中で最小となる要素を返すこともできます。
最小値の検索対象となるオブジェクトは比較される際にすべて同じ型である必要があり、異なる場合はエラーが発生します。
また、引数として与えた反復可能オブジェクトが空の状態でもエラーが発生します。
これらのエラーの発生を抑えたり、最小値の比較キーを指定するためにキーワード引数としてkeyやdefaultを指定することができます。
# 定義
min(iterable, *[, key, default])
min(arg1, arg2, *args[, key])
TL;DR
基本
# 第1引数には反復可能なオブジェクト(ここではリスト)をとる
list1 = [0, 1, 2]
min_value1 = min(list1)
print(min_value1)
==> 0
# タプル
tuple1 = (200, 100, 300)
min_value2 = min(tuple1)
print(min_value2)
==> 100
# 文字列も反復可能オブジェクト
str1 = 'abcdef'
min_value3 = min(str1)
print(min_value3)
==> a
# 多次元リスト(多次元配列)の場合
# 「リストの要素であるリスト」の値に従って最小値が決められる(詳しくは関連1次情報を参照のこと)
list2 = [[0, 1], [2, 3], [4, 5]]
min_value4 = min(list2)
print(min_value4)
==> [0, 1]
# 反復可能オブジェクトの要素の型が異なるとエラー
list3 = [0, 1, '2', 3]
min_value5 = min(list3)
print(min_value5)
==> TypeError: '<' not supported between instances of 'str' and 'int'
# 反復可能オブジェクトが空(empty)だとエラー
list3 = []
min_value5 = min(list3)
print(min_value5)
==> ValueError: min() arg is an empty sequence
関連情報:list(リスト・配列)の使用方法
関連1次情報:値の比較 - Pythonドキュメント
最小値の比較キーの指定
# リストの要素の型が揃っていないと比較(最小値の検索)できない
list1 = ['0', '1', 2]
min_value1 = min(list1)
==> TypeError: '<' not supported between instances of 'int' and 'str'
# キーワード引数keyに関数を指定して比較キーの指定ができる
# key=intの指定で比較を行う際に要素をint型に変更することができる
list1 = ['0', '1', 2]
min_value1 = min(list1, key=int)
print(min_value1)
==> 0
# 戻り値の型は元の文字列のまま
print(type(min_value1))
==> <class 'str'>
# lambdaの指定も可能(ageの値を比較キーとして最小値を探す)
list2 = [{'name': 'Julia', 'age': 28}, {'name': 'Joshua', 'age': 19}]
min_value2 = min(list2, key=lambda e: e['age'])
print(min_value2)
==> {'name': 'Joshua', 'age': 19}
関連情報:type(組み込み関数)の使用方法
関連情報:lambda(ラムダ式)の使用方法
最小となる値が複数ある場合
# 最小となる要素が複数ある場合、最初の要素が戻り値となる
list1 = [{'id': 1, 'score': 20}, {'id': 2, 'score': 63}, {'id': 3, 'score': 20}]
min_value1 = min(list1, key=lambda v: v['score'])
print(min_value1)
==> {'id': 1, 'score': 20}
# 最小値となる要素を全て取得したい場合
list1 = [{'id': 1, 'score': 20}, {'id': 2, 'score': 63}, {'id': 3, 'score': 20}]
min_value_element1 = min(list1, key=lambda e: e['score'])
min_value_list1 = []
for element in list1:
if element['score'] == min_value_element1['score']:
min_value_list1.append(element)
print(min_value_list1)
==> [{'id': 1, 'score': 20}, {'id': 3, 'score': 20}]
# 最小値となる要素を全て取得したい場合(リスト内包表記)
list1 = [{'id': 1, 'score': 20}, {'id': 2, 'score': 63}, {'id': 3, 'score': 20}]
min_value_element2 = min(list1, key=lambda e: e['score'])
min_value_list2 = [e for e in list1 if e['score'] == min_value_element2['score']]
print(min_value_list2)
==> [{'id': 1, 'score': 20}, {'id': 3, 'score': 20}]
関連情報:forの使用方法
関連情報:ifの使用方法
キーワード引数defaultの指定
# 反復可能オブジェクトが空(empty)だとエラー
list1 = []
min_value1 = min(list1)
==> ValueError: min() arg is an empty sequence
# キーワード引数defaultを使用するとエラーが抑制され、指定した値が返る
list1 = []
min_value1 = min(list1, default='Empty')
print(min_value1)
==> Empty
位置引数を2つ以上指定する場合
# 2つ以上の位置引数を与え、その中での最小値を求めることができる
min_value1 = min(1, 2, 3)
print(min_value1)
==> 1
# キーワード引数との併用
min_value2 = min(100, 300, '200', key=int)
print(min_value2)
==> 100
関連情報:位置引数 - 引数の定義
解説
# 定義
min(iterable, *[, key, default])
min(arg1, arg2, *args[, key])
基本
min関数は引数の取り方のパターンとして、第1引数に反復可能(iterable)オブジェクトを取ることができます。 (もう1つのパターンは位置引数を2つ以上指定する場合) その反復可能オブジェクトの要素の中で、最小の値となる要素を戻り値として返します。
引数として与える反復可能オブジェクトの要素の型はすべて同じである必要があり、そうでない場合はTypeError
が発生します。
反復可能オブジェクトの要素数が0(empty)の場合はValueError
が発生します。
list1 = [10, 20, 30]
min_value1 = min(list1)
print(min_value1)
==> 10
# 文字列も反復可能オブジェクト
str1 = 'abc'
min_value2 = min(str1)
print(min_value2)
==> a
# 反復可能オブジェクトの要素の型が異なるとエラー
list2 = [0, '1', 2]
min_value3 = min(list2)
print(min_value3)
==> TypeError: '<' not supported between instances of 'str' and 'int'
# 反復可能オブジェクトが空(empty)だとエラー
list3 = []
min_value4 = min(list3)
==> ValueError: min() arg is an empty sequence
関連情報:list(リスト・配列)の使用方法
最小値の比較キーの指定
キーワード引数key
には、引数を1つとる関数を指定します。
この関数は反復可能オブジェクトの要素すべてに適用され(関数の第1引数に各要素が与えられる)、
「keyに与えた関数の戻り値」を対象に最小値が計算されて「min関数の戻り値」が決まります。
これにより、型が異なる値が混合している反復可能オブジェクトや、dict型(辞書型)や独自クラスなどの特定の値を元にした最小値の検索ができるようになります。
注意点として、min関数の戻り値は反復可能オブジェクト内の元の要素のまま(同じ型)であることが挙げられます。
# str型とint型が混じっているので最小値を検索できない
list1 = ['0', '1', 2, '3']
min_value1 = min(list1)
==> TypeError: '<' not supported between instances of 'int' and 'str'
# int型に変換して比較が行われる
list1 = ['0', '1', 2, '3']
min_value1 = min(list1, key=int)
print(min_value1)
==> 0
# 返り値の型は元の要素のまま
print(type(min_value1))
==> <class 'str'>
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return repr((self.name, self.age))
# lambdaを使用して比較対象をageにする
tuple1 = (Person('Thomas', 22), Person('Olivia', 18))
min_value2 = min(tuple1, key=lambda person: person.age)
print(min_value2)
==> ('Olivia', 18)
関連情報:type(組み込み関数)の使用方法
関連情報:class(クラス定義)の使用方法
関連情報:lambda(ラムダ式)の使用方法
最小となる値が複数ある場合
min関数は最小となる値が複数存在する場合に、最初に現れる要素を戻り値として返します。
最小となる値の要素をすべて取得したい場合、以下のコード例のように for文、 if文、 リスト内包表記 などを組み合わせてロジックを組み立ててみてください。
# 最初の要素が戻り値となる
list1 = [{'key1': 1, 'key2': 'value1'}, {'key1': 1, 'key2': 'value2'}, {'key1': 100, 'key2': 'value3'}]
min_value1 = min(list1, key=lambda v: v['key1'])
print(min_value1)
==> {'key1': 1, 'key2': 'value1'}
# 最小値となる要素を全て取得(リスト内包表記)
list1 = [{'key1': 1, 'key2': 'value1'}, {'key1': 1, 'key2': 'value2'}, {'key1': 100, 'key2': 'value3'}]
min_key1_value = min(list1, key=lambda v: v['key1'])['key1']
min_value_list1 = [e for e in list1 if e['key1'] == min_key1_value]
print(min_value_list1)
==> [{'key1': 1, 'key2': 'value1'}, {'key1': 1, 'key2': 'value2'}]
キーワード引数defaultの指定
min関数は引数として与える反復可能オブジェクトが空の状態(empty)だと、ValueError
が発生します。
キーワード引数default
を与えると、反復可能オブジェクトが空の場合に戻り値として返すオブジェクトを指定することができます。
これにより、反復可能オブジェクトが空でもエラーが発生しません。
# 反復可能オブジェクトが空(empty)だとエラー
list1 = []
min_value1 = min(list1)
==> ValueError: min() arg is an empty sequence
# キーワード引数defaultを使用するとエラーが抑制され、指定した値が返る
list1 = []
min_value1 = min(list1, default=0)
print(min_value1)
==> 0
位置引数を2つ以上指定する場合
min関数の引数として反復可能オブジェクトではなく、
2つ以上の位置引数(3つ目以降は可変長引数)を与えることで、それらの引数の中で最小の値を戻り値として返すことができます。
キーワード引数keyやdefaultとの併用も可能です。
min_value1 = min('c', 'a', 'A')
print(min_value1)
==> A
# キーワード引数との併用
min_value2 = min('c', 'a', 'A', key=str.lower)
print(min_value2)
==> a
関連情報:位置引数 - 引数の定義