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