BlankTar

about | blog | works | photo

初心に帰って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文書きまくるより短くていいです。若干見づらいけれど。
< 続:google+はメールアドレスを流出させる(かもしれない) nginxでエラーページが表示されない >