各要素が次のようなタプルである Python のリストがあります。
(attr1, attr2, attr3)
最大の を持っているタプルを見つけたいのですattr2
が、 を持っていattr3 >= 100
ます。
これに対するpythonicアプローチは何ですか?
key
max への引数をフィルタリングして使用する必要があります。
from operator import itemgetter
max(filter(lambda a: a[2] >= 100, yourlist), key=itemgetter(1))
フィルターは、ジェネレーター式として表現することもできます。
max((t for t in yourlist if t[2] >= 100), key=itemgetter(1))
デモ:
>>> yourlist = [(1, 2, 300), (2, 3, 400), (3, 6, 50)]
>>> max((t for t in yourlist if t[2] >= 100), key=itemgetter(1))
(2, 3, 400)
>>> max(filter(lambda a: a[2] >= 100, yourlist), key=itemgetter(1))
(2, 3, 400)
フィルタリングするため、最大値を選択するための空のリストになってしまうのは簡単なのでValueError
、コールスタックを伝播するためにその例外が必要でない限り、 s をキャッチする必要があるかもしれません:
try:
return max(filter(lambda a: a[2] >= 100, yourlist), key=itemgetter(1))
except ValueError:
# Return a default
return (0, 0, 0)
最大値のインデックスも必要な場合は、次のようにします。
max(filter(lambda a: a[1][2] >= 100, enumerate(yourlist)), key=lambda x:x[1][1])`
少し読みにくくなることは認めざるを得ませんが。