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