Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでペアの行(全要素が偶数回出現する行)を抽出する方法

ネストされたリスト(リストのリスト)から、「ペアの行」――すなわち行内のすべての要素が偶数回出現する行――だけを抽出したいケースがあります。このような場合、リスト内包表記と組み込み関数all()を組み合わせると、簡潔かつ読みやすく実装できます。

サンプルコード

以下に具体的な実装例を示します。

my_list = [[10, 21, 34, 21, 37], [41, 41, 52, 68, 68, 41], [12, 29], [30, 30, 51, 51]]

print("The list is :")
print(my_list)

my_result = [row for row in my_list if all(row.count(element) % 2 == 0 for element in row)]

print("The result is :")
print(my_result)

実行結果

The list is :
[[10, 21, 34, 21, 37], [41, 41, 52, 68, 68, 41], [12, 29], [30, 30, 51, 51]]
The result is :
[[30, 30, 51, 51]]

処理の解説

  • まず、リストのリスト(ネストされたリスト)を定義し、その内容をコンソールに表示します。

  • リスト内包表記を使って、元のリストの各行を順番に走査します。

  • all() 関数により、行内の各要素に対して count() メソッドで出現回数を取得し、その値が2で割り切れるかどうかを判定します。すべての要素が条件を満たす場合のみ True を返します。

  • 条件を満たした行だけが新しいリストとしてまとめられ、変数 my_result に代入されます。

  • 最後に、抽出結果をコンソールに出力して完了です。

補足:collections.Counterを使った別のアプローチ

row.count(element) は要素ごとに行全体を走査するため、行が長くなると計算量が増えます。collections.Counter を使えば、各要素の出現回数を一度で集計でき、より効率的に同じ処理を実現できます。

from collections import Counter

my_result = [row for row in my_list if all(v % 2 == 0 for v in Counter(row).values())]

どちらの方法でも結果は同じですが、データサイズが大きい場合はCounter版の方がパフォーマンス面で有利です。

  1. Pythonで偶数の長さの文字列のみを含む行を抽出する方法

    文字列のリストの中から「すべての要素が偶数の長さである行」だけを抽出したい場合、リスト内包表記と all() 関数、そして剰余演算子 % を組み合わせると、簡潔に実現できます。 以下に具体的な例を示します。 サンプルコード my_list = [[python, is, best], [best, good, python], [is, better], [for, coders]] print(The list is :) print(my_list) my_result = [row for row in my_list if all(len(element) % 2 == 0 fo

  2. Pythonで文字列リストから数値を抽出する2つの方法:splitとmap/isnumericの使い方

    Pythonでデータ処理を行っていると、文字と数字が混在し、かつ一定のパターンを持つリストに遭遇することがあります。例えば「曜日-数値」のように、識別子と数値が組み合わされたデータは実務でもよく見られます。 本記事では、このようなリストから数値部分だけを抽出し、その後の計算や集計に利用できるようにする方法を、2つのアプローチで解説します。 方法1:split関数を使う split() 関数は、指定した区切り文字を基準に文字列を分割します。以下の例では、リストの各要素がハイフン(-)によって文字部分と数値部分に区切られています。この特徴を利用し、リスト内包表記で各要素を処理することで、数値部分を