Pythonで偶数回出現する要素のみを含む行列の行を抽出する方法
行列(リストのリスト)の中から、すべての要素が偶数回出現している行だけを抽出したいケースは、データ処理の場面でよくあります。この記事では、Pythonの標準ライブラリ collections.Counter と、組み込み関数 all() を組み合わせたリスト内包表記を使って、この問題を簡潔に解決する方法を解説します。
サンプルコード
以下が実際のコード例です。
from collections import Counter
my_list = [[41, 25, 25, 62], [41, 41, 41, 41, 22, 22], [65, 57, 65, 57], [11, 24, 36, 48]]
print("The list is :")
print(my_list)
my_result = [sub for sub in my_list if all(value % 2 == 0 for key, value in list(dict(Counter(sub)).items()))]
print("The result is :")
print(my_result)実行結果
The list is : [[41, 25, 25, 62], [41, 41, 41, 41, 22, 22], [65, 57, 65, 57], [11, 24, 36, 48]] The result is : [[41, 41, 41, 41, 22, 22], [65, 57, 65, 57]]
コードの解説
まず、複数のリストを含むリスト(行列)を定義し、コンソールに表示して元の状態を確認します。
リスト内包表記を使って各行を順番に取り出し、条件判定を行います。
各行に対して
Counter(sub)を適用すると、各要素の出現回数をカウントしたオブジェクトが得られます。これをdict()で辞書化することで、「要素: 出現回数」のペアとして扱えるようになります。all()関数とジェネレータ式を組み合わせ、すべての出現回数(value)が2で割り切れる(=偶数回出現している)かどうかを一括チェックします。条件を満たす行だけが新しいリストとして抽出され、結果がコンソールに出力されます。
処理のポイント
例えば [41, 41, 41, 41, 22, 22] の場合、41が4回、22が2回出現しており、どちらも偶数回なのでこの行は抽出対象になります。一方 [41, 25, 25, 62] では、41と62が1回ずつしか出現していないため除外されます。
なお、list(dict(...)) の部分は省略可能で、Counter(sub).values() を直接使うとよりシンプルに書けます。
-
Pythonでタプルのリストから正の要素のみを持つタプルを抽出する方法
タプルのリストから「すべての要素が正の値(0以上)」であるタプルだけを取り出したい場合、リスト内包表記を使うと非常に簡潔に実現できます。 サンプルコード my_list = [(56, 43), (-31, 21, 23), (51, -65, 26), (24, 56)] print("The list is : ") print(my_list) my_result = [sub for sub in my_list if all(elem >= 0 for elem in sub)] print("The positive elements ar
-
Pythonでリスト内の要素の出現頻度(出現回数)を数える方法
この記事では、Pythonでリスト内の各要素が何回出現するか(出現頻度)を調べる方法を解説します。実装のアプローチはいくつかありますが、ここでは代表的な2つの方法を紹介します。 方法1:辞書を使って手動でカウントする まず、辞書を活用してロジックを自前で実装する基本の方法から見ていきましょう。以下の手順でコードを作成します。 要素を含むリストと、空の辞書を用意します。 リストの各要素を順番に処理します。 その要素がすでに辞書に存在するかどうかを確認します。 存在する場合は、対応するカウントを1つ増やします。 存在しない場合は、カウントを1で新しく登録します。 最後に結果の辞書を出力し