Pythonでリストの各要素に大きさの順位(ランク)を割り当てる方法
概要
リスト内の各要素に対して、その値の大きさ順(順位)に対応する数値を割り当てたい場面は少なくありません。たとえば、最小の要素には 0、その次に小さい要素には 1、というようにランクを付けていくイメージです。Pythonでは、set() による重複の除去、sorted() による並べ替え、zip() 関数、さらにリスト内包表記を組み合わせることで、この処理を簡潔に実装できます。
サンプルコード
以下は、実際の動作を確認できるデモです。
my_list = [91, 42, 27, 39, 24, 45, 53]
print("元のリスト:")
print(my_list)
# 一意な値を昇順に並べ替え、値と順位(0始まり)を対応させた辞書を作成
my_ordered_dict = dict(zip(sorted(set(my_list)), range(len(set(my_list)))))
# 各要素を対応する順位へ変換
my_result = [my_ordered_dict[elem] for elem in my_list]
print("変換結果:")
print(my_result)
実行結果
元のリスト: [91, 42, 27, 39, 24, 45, 53] 変換結果: [6, 3, 1, 2, 0, 4, 5]
処理の流れ
- まずリストを定義し、コンソールに表示します。
set()を使ってリストから重複を取り除き、一意な値だけを抽出します。sorted()で昇順に並べ替えて「小さい順」の並びを作ります。set() は順序を保持しないため、この並べ替えは必須です。range()が生成する連番(0, 1, 2, …)とzip()でペアリングし、dict()で「値 → 順位」という対応表の辞書に変換します。- この辞書を変数に格納します。
- 最後にリスト内包表記で元のリストの各要素を順位に置き換え、結果をコンソールに表示します。
ポイント解説
この手法の核心は zip(sorted(set(my_list)), range(...)) の部分です。重複を除いて昇順に並べた値の列と、0から始まる連番を先頭から順にペアにすることで、「最小値 → 0」「2番目に小さい値 → 1」という対応関係が自動的に構築されます。また、元のリストに同じ値が複数含まれている場合でも、set() が重複を排除するため、それらの要素にはすべて同じ順位が割り当てられます。
別の書き方:辞書内包表記を使う
zip() と dict() の代わりに、辞書内包表記と enumerate() を組み合わせても同じ結果が得られます。
rank_map = {val: idx for idx, val in enumerate(sorted(set(my_list)))}
my_result = [rank_map[elem] for elem in my_list]
どちらの書き方も結果は同一ですが、辞書内包表記の方が意図が伝わりやすいと感じる人もいます。可読性やチームのコーディング規約に合わせて使い分けるとよいでしょう。
-
Pythonのリストから最小値の要素を取得する方法をわかりやすく解説
Pythonでリストの中から最小値を持つ要素を取得したい場合は、組み込み関数の min() を使います。min() 関数にリストを引数として渡すと、先頭から順に要素を走査し、それまでに見つかった最小値を記憶しながらリストの末尾まで進み、最終的にその最小値を返します。基本的な使い方まずは最もシンプルな例を見てみましょう。my_list = [2, 3, 1, 5, -1] print(min(my_list))実行結果-1このように、リスト内の最小値である -1 が出力されます。数値以外にも、文字列のリスト(辞書順で最小のもの)などにも同じように使えます。最小値のインデックスも取得したい場合最小
-
Pythonでリスト内の最大値を持つ要素を見つける方法
Pythonのリストから最大値を持つ要素を見つけるには、組み込み関数 max() にリストを引数として渡すだけです。max() 関数はリストを先頭から順に走査し、それまでに見つけた最大値を記録しながら末尾まで進み、最終的にその最大値を返します。基本的な使い方以下は、リスト内の最大値を取得するシンプルな例です。my_list = [2, 3, 1, 5, -1] print(max(my_list))出力結果このコードを実行すると、次のように最大値が出力されます。5最大値のインデックス(出現位置)も取得する方法最大値そのものだけでなく、リスト内で最大値が出現するすべての位置(インデックス)を知り