Python – ネストされたリストの各行の要素頻度が同一かどうかを判定する方法
リストの中に含まれる複数の行(サブリスト)について、それぞれの行に現れる要素の出現頻度がすべて同じかどうかを確認したい場合があります。このようなときは、組み込み関数 all() と、collections モジュールの Counter クラス、そしてシンプルな反復処理(ジェネレータ式)を組み合わせることで、簡潔に実装できます。
Counter は各要素の出現回数を自動的に集計してくれるため、「どの要素が何回使われているか」を辞書形式で簡単に取得できるのがポイントです。以下に具体的な例を示します。
サンプルコード
from collections import Counter
my_list = [[21, 92, 64, 11, 3], [21, 3, 11, 92, 64], [64, 92, 21, 3, 11]]
print("The list is :")
print(my_list)
my_result = all(dict(Counter(row)) == dict(Counter(my_list[0])) for row in my_list )
if(my_result == True):
print("All rows have similar frequency")
else:
print("All rows do not have similar frequency")
実行結果
The list is : [[21, 92, 64, 11, 3], [21, 3, 11, 92, 64], [64, 92, 21, 3, 11]] All rows have similar frequency
処理の流れと解説
まず、必要なパッケージである
collectionsモジュールからCounterをインポートします。整数を要素とするネストされたリスト(リストのリスト)を定義し、その内容をコンソールに表示します。
ジェネレータ式の中で、各行を
Counterオブジェクトに変換し、さらにdict()で辞書型に変換します。これにより、各要素とその出現回数の対応関係が得られます。基準となる先頭の行(
my_list[0])の頻度辞書と、他のすべての行の頻度辞書を比較し、要素ごとの出現回数が一致しているかどうかを確認します。すべての行が一致していれば
all()はTrueを返し、その結果が変数に格納されます。1行でも異なる頻度があればFalseになります。最後に、この真偽値に応じて、対応するメッセージがコンソールに出力されます。
補足ポイント
この手法では、行内の要素の並び順は問われず、あくまで「各要素の出現回数」だけが比較対象になります。そのため、要素がシャッフルされた行同士でも、頻度構成が同じであれば同一と判定されます。また、辞書同士の等価比較はキーと値の両方が一致した場合のみ True になるため、頻度の違いも正確に検出できます。
-
【Python入門】itertools.groupbyでリスト内の類似文字列をグループ化する方法
このチュートリアルでは、リスト内の類似した文字列をグループ化するプログラムをPythonで作成します。まずは具体的な例を見ながら、処理の流れを確認していきましょう。入力データstrings = [tutorials-python, tutorials-c, tutorials-java, tutorials-javascript, python-1, python-2, javascript-1]期待される出力[[tutorials-python, tutorials-c, tutorials-java, tutorials-javascript], [python-1, python-2],
-
Pythonのタプルリストから要素の出現頻度を求める方法
Pythonでは、さまざまな種類のデータコンテナが混在することがよくあります。たとえば、リストの各要素がタプルになっているケースです。本記事では、このような「タプルを要素とするリスト」から、特定の要素が出現する頻度(出現回数)を求める2つの方法を紹介します。 方法1:count() と map() を使う まず、ラムダ式(lambda)を使ってリスト内の各タプルの先頭要素を取り出し、map() 関数でそれらをまとめたうえで、count() を適用して目的の要素の合計出現回数を取得します。 コード例 # タプルのリストを初期化 listA = [(Apple, Mon), (Banana, Tu