【Python】リストから大きい/小さい順にn個の要素を取り出す
Pythonの標準ライブラリであるheapq.nlargest
/ heapq.nsmallest
を使用することで,
リストから簡単に大きい/小さい順にn個の要素を取り出すことができます.
import heapq import random a = [random.randint(0,1000) for _ in range(10)] print(a) # [326, 859, 181, 700, 582, 144, 71, 495, 381, 838] print(heapq.nlargest(2, a)) # [859, 838] print(heapq.nsmallest(2, a)) # [71, 144]
ただし注意もあり,公式ドキュメントによれば,基本的に一回だけ大きい/小さい順に値を取り出すだけであれば,
配列をソートして取り出した方が高速です.
また最大値/最小値を取り出すのもmax
/ min
の方が高速です.
この処理を複数回行う際に,iterable objectをヒープ化して実行するのが良い,とのことでした.
参考
【Python】変数の型以外のメタ情報をアノテーションするtyping.Annotated
はじめに
今回はtyping.Annotated
を用いて,変数に型以外のメタ情報もアノテーションする方法について調べたので,こちらにメモを残しておきます.
こちらを使うことで,より可読性の高いコードが書けるようになります
typing.Annotated
とは
typing.Annotated
を用いることで,変数に型以外のメタ情報もアノテーションすることができます.
これらのメタ情報はmypyでは考慮されないもので,単に可読性を向上させることを目的としているようです.
以下の例を考えます.重さと体積から密度を計算する関数です.
def get_density(weight: float, volume: float) -> float: return weight / volume
こちらの関数は型アノテーションがされており,一見問題ないように見えますが,weight
やvolume
の単位がわかりません.
単位の情報を明示するため方法として,コメントに残すのもありですが,typing.Annotated
を使用することで,よりわかりやすくコードを書くことができます.
from typing import Annotated def get_density( weight: Annotated[float, "kg"], volume: Annotated[float, "cubic metre"] ) -> Anntated[float, "kg per cubic metre"]: return weight / volume