pythonで最大値、最小値を求める色々
初心に帰ってpythonで色んなものの最大値、最小値を求める方法。max関数、min関数の使い方です。 意外とこういう系のワードで検索してる人が多いっぽいので。
リストとかタプルとか集合型とか
まずは一番基本。リスト型とタプル型。ちょっと変わり種で集合型。
>>> list = [1, 4, 8, 2] >>> max(list) 8 >>> min(list) 1 >>> tuple = (1, 4, 8, 2) >>> max(tuple) 8 >>> min(tuple) 1 >>> set = {1, 4, 8, 2} >>> max(tuple) 8 >>> min(tuple) 1
うん、何も考えること無い。
入れ子になっている場合は
>>> list = [ ... (1, 8, 6), ... (4, 2, 9), ... (7, 5, 3), ... ] >>> max(list, key=(lambda x: x[0])) (7, 5, 3) >>> max(list, key=(lambda x: x[1])) (1, 8, 6) >>> max(list, key=(lambda x: x[2])) (4, 2, 9)
みたいなことが出来ます。
複数のリスト(or タプル, 集合)の中の最大値を出したい場合は
>>> max(list + list(tuple) + list(set))
足しちゃえばいいんじゃないかな、素直に。
>>> max(max(list), max(tuple), max(max))
なんて解決方法もあるけれど、なんか面倒くさい。
辞書型
辞書型の場合、何も考えずに使うとkeyの最大値/最小値を出してくれます。
>>> dict = {1:9, 2:8, 3:7, 4:6} >>> max(dict) 4 >>> min(dict) 1
for x in dict:
ってした時にxにはkeyが入るのと同じ、って考えると分かりやすい、かも?
いや、俺はvalue、値のほうが欲しいんだ。って場合は、
>>> max(dict[x] for x in dict) 9
みたいにしましょう。
比較するのはvalueの方だけど、返して欲しいのはkey? そんなときは
>>> max(dict, key=(lambda x: dict[x])) 1
こんな感じで解決。
それ以外のクラスとか諸々
例えばdatetime型にしましょうか。日付と時間ね。
>>> import datetime >>> a = datetime.datetime.now() >>> b = datetime.datetime.now() >>> c = datetime.datetime.now() >>> a < b True >>> max(a, b, c) == a False >>> min(a, b, c) == c True
datetime同士の比較が可能な場合、どんなオブジェクト相手にもmax関数、min関数を使うことが出来ます。
そうじゃないんだ、日付無視して時間だけを比べたいんだ。なんてときは
>>> f = lambda x: x.hour*60*60 + x.minute*60 + x.second
日付を含まず時間だけをint型に変換する関数を用意してみました。
これを使って
>>> max(a, b, c, key=f) == a False >>> max(a, b, c, key=f) == c True
みたいな感じに。
比較可能な値を返す関数があれば何にでもmax/minを使えるので、結構便利。
ちょっとした応用
ゲーム作ってる時とかに、キャラが画面の外に出ないようにしたい、みたいな状況。 最大値最小値を超えたら最大/最小で値を固定するような用途ね。
そんなときは
>>> x = min(max(x, 0), SCREEN_WIDTH) >>> y = min(max(y, 0), SCREEN_HEIGHT)
みたいにすると便利。
if文書きまくるより短くていいです。若干見づらいけれど。