Pythonでタプルを絶対差の出現頻度順にソートする方法
リスト内のタプルを、各タプル内の2つの数値の「絶対差」が出現する頻度に基づいて並べ替えたい場合があります。このような処理には、lambda関数と、Pythonの組み込み関数であるabsおよびsortedを組み合わせるのが効果的です。
サンプルコード
以下に具体的な実装例を示します。
my_list = [(11, 26), (21, 33), (90, 11), (26, 21), (32, 18), (25, 37)]
print("The list is :")
print(my_list)
my_diff_list = [abs(x - y) for x, y in my_list]
my_result = sorted(my_list, key = lambda sub: my_diff_list.count(abs(sub[0] - sub[1])))
print("The resultant list is :")
print(my_result)
出力
The list is : [(11, 26), (21, 33), (90, 11), (26, 21), (32, 18), (25, 37)] The resultant list is : [(11, 26), (90, 11), (26, 21), (32, 18), (21, 33), (25, 37)]
コードの解説
- まず、複数のタプルを含むリストを定義し、その内容をコンソールに表示します。
- 次に、リスト内包表記を使ってリストを反復処理し、各タプル内の2つの要素の差を
abs関数で絶対値に変換します。 - 得られた絶対差の一覧はリストとして変数
my_diff_listに格納されます。 - 続いて
sortedメソッドを使用し、ソートの基準となるキーをlambda式で指定します。ここでは、各タプルの絶対差がmy_diff_list内に何回出現するかをcountメソッドで数え、その頻度をキーとしています。 - 頻度が小さいものから順に昇順で並べ替えられた結果が変数
my_resultに代入され、最後にコンソールへ出力されます。
補足:より効率的なアプローチ
上記の方法では、要素ごとにcountを呼び出すため、リストが大きくなると計算量が増加します。標準ライブラリのcollections.Counterを使えば、頻度を事前に一度だけ集計できるため、パフォーマンスを向上させることができます。
from collections import Counter my_diff_count = Counter(abs(x - y) for x, y in my_list) my_result = sorted(my_list, key=lambda sub: my_diff_count[abs(sub[0] - sub[1])]) print(my_result)
なお、Pythonのsortedは安定ソート(同じキーを持つ要素の元の順序が保持される)であるため、頻度が同じタプル同士は元のリストでの登場順に並びます。用途に応じて両者の使い分けを検討するとよいでしょう。
-
Pythonのリスト(list)とタプル(tuple)の違いを徹底解説!使い分けのポイント
Pythonには複数の値をまとめて扱うためのデータ構造として「リスト(list)」と「タプル(tuple)」が用意されています。どちらもシーケンス型の一種で似たような使い方ができますが、「変更可能かどうか」「処理速度」「メモリ効率」などの点で大きな違いがあります。この記事では、それぞれの特徴とコード例、そして6つの観点からの比較表を使って、両者の違いと使い分けのポイントをわかりやすく解説します。リスト(list)とはリストは、異なる型のオブジェクトを格納できるミュータブル(変更可能)なコンテナです。要素の追加・削除・変更が自由に行えるため、データの入れ替えや繰り返し処理(イテレーション)によく
-
Pythonでリスト内のすべてのペア間の絶対差の合計を求めるプログラム
本記事では、リスト内のすべてのペア間の絶対差の合計を求める問題の解法とアプローチについて解説します。 問題文 リストが入力として与えられたとき、そのリスト内のすべてのペア間の絶対差の合計を求める必要があります。 解法のアプローチ enumerate() メソッドは、イテラブル(反復可能オブジェクト)にカウンターを付加し、enumerate オブジェクトとして返す組み込み関数です。ループ処理の中でインデックスと要素を同時に取得したい場合に非常に便利です。 この手法では、まず絶対差を格納するためのリスト「diffs」を用意します。 次に、2つの変数を持つ二重ループを使用します。片方はカウンター(イ