Pythonで「前の要素より大きい要素の数」に基づいてマトリックス(ネストされたリスト)をソートする方法
はじめに
Pythonでは、各行(リスト)の中に「直前の要素より大きい要素」がいくつ含まれているかを基準にして、マトリックス(リストのリスト)を並べ替えることができます。
このような処理を行うには、リスト内包表記とlen() メソッドを組み合わせた関数を定義し、それを sort() の key 引数に渡すのが一般的です。
以下に具体的な実装例を示します。
サンプルコード
def fetch_greater_freq(row):
return len([row[idx] for idx in range(0, len(row) - 1) if row[idx] < row[idx + 1]])
my_list = [[11, 3, 25, 99, 10], [5, 3, 25, 4], [77, 11, 5, 3, 77, 77], [11, 3, 25]]
print("The list is :")
print(my_list)
my_list.sort(key=fetch_greater_freq)
print("The resultant list is :")
print(my_list)
実行結果
The list is :
[[11, 3, 25, 99, 10], [5, 3, 25, 4], [77, 11, 5, 3, 77, 77], [11, 3, 25]]
The resultant list is :
[[5, 3, 25, 4], [77, 11, 5, 3, 77, 77], [11, 3, 25], [11, 3, 25, 99, 10]]
コードの解説
fetch_greater_freq 関数の定義: リスト(行)を引数として受け取る関数「fetch_greater_freq」を定義します。
昇順ペアのカウント: リスト内包表記を使って各要素を走査し、「その要素が隣接する次の要素より小さいかどうか」を判定します。条件を満たす要素だけを新しいリストに集めます。
長さを返却: 条件を満たした要素の個数(リストの長さ)を len() で取得し、関数の戻り値として返します。
データの準備: 関数の外側で整数のリストのリスト(マトリックス)を定義し、コンソールに表示します。
ソートの実行: sort() メソッドの key 引数に先ほど定義した関数を渡すことで、「昇順ペアの数が少ない行から多い行へ」の順にリストが並べ替えられます。
結果の表示: ソート後のリストをコンソールに出力します。
補足:より簡潔な書き方
zip() を使うと、隣接する要素同士の比較をさらに簡潔に記述できます。
def fetch_greater_freq(row):
return sum(1 for prev, curr in zip(row, row[1:]) if prev < curr)
また、元のリストを変更せずに新しいソート済みリストを作成したい場合は、破壊的な sort() の代わりに組み込み関数 sorted(my_list, key=fetch_greater_freq) を使用するとよいでしょう。
-
PythonでKより大きい最初の要素のインデックスを取得する方法
Pythonのリスト内の要素は、必ずしもソートされた順序で並んでいるとは限りません。また、特定の値よりも大きい値だけに関心があるケースも少なくありません。この記事では、リスト内でKより大きい値を持つ最初の要素のインデックスを取得する方法を、複数のアプローチから解説します。方法1:enumerate()とnext()を組み合わせるenumerate()関数を使うと、リスト内の各要素についてインデックスと値の両方を同時に取得できます。そこに「25より大きい」という条件を適用し、条件を満たす最初の要素だけを取り出します。next()関数がリストの各要素を順番に処理し、条件が成立した時点で結果を返しま
-
Pythonでfloat要素を基準にタプルをソートする方法
この記事では、float型の数値を含むタプルのリストを、その数値を基準にソートする方法を解説します。Pythonの組み込み関数 sorted() を使った方法を中心に、key 引数や reverse 引数の使い方もあわせて紹介します。実行例たとえば、名前と数値(文字列形式)のペアからなるタプルのリストを、数値が大きい順に並べ替えるケースを考えてみましょう。入力: tuple = [(AAA, 10.265), (BBB, 24.107), (CCC, 26.541), (DDD, 14.256), (EEE, 11.365)] 出力: [(CCC, 26.541), (BBB, 24.107