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

Pythonで特定のペア合計を持つ行をフィルタリングする方法

リストの中から、特定の合計値になる2つの要素(ペア)を含む行だけを抽出したい場面はよくあります。Pythonでは、専用の関数を定義し、リスト内包表記と組み合わせることで、この処理をシンプルかつ効率的に実現できます。

本記事では、指定したキー(目標値)と一致するペア合計を持つ行をフィルタリングするプログラムを、コード例・実行結果・詳しい解説とともに紹介します。

コード例

def find_sum_pair(val, key):

   for index in range(len(val)):
      for ix in range(index + 1, len(val)):
         if val[index] + val[ix] == key:
            return True
   return False

my_list = [[71, 5, 21, 6], [34, 21, 2, 71], [21, 2, 34, 5], [6, 9, 21, 42]]

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

my_key = 76
print("The key is ")
print(my_key)

my_result = [element for element in my_list if find_sum_pair(element, my_key)]

print("The resultant list is :")
print(my_result)

実行結果

The list is :
[[71, 5, 21, 6], [34, 21, 2, 71], [21, 2, 34, 5], [6, 9, 21, 42]]
The key is
76
The resultant list is :
[[71, 5, 21, 6]]

コードの解説

  • まず、find_sum_pair という名前の関数を定義します。この関数は2つの引数を受け取ります。第1引数はチェック対象のリスト、第2引数は目標となる合計値(キー)です。

  • 関数内部では、二重の for ループ を使ってリスト内のすべての要素の組み合わせを走査します。外側のループ変数 index に対して、内側のループ変数 ixindex + 1 から始まるため、同じ要素同士の組み合わせは除外され、重複のないペアのみがチェックされます。

  • 2つの要素 val[index]val[ix] の合計がキーと一致した場合、その時点で True を返します。これにより、無駄な比較を省き、処理を高速化しています。

  • すべての組み合わせを調べても一致するペアが見つからなかった場合は、False を返します。

  • 関数の外部では、複数のリストを含むリストのリスト(入れ子構造のリスト)を定義し、コンソールに表示しています。

  • 次に、フィルタリングの条件となるキー(ここでは 76)を変数 my_key に設定します。

  • リスト内包表記 を使用して元のリストを反復処理し、各要素(サブリスト)に対して find_sum_pair 関数を呼び出します。関数が True を返したサブリストだけが新しいリストに含まれます。

  • その結果は変数 my_result に代入され、最後にコンソールへ出力されます。

実行結果のポイント

今回の例では、キーとして 76 を指定しました。4つのサブリストのうち、[71, 5, 21, 6] のみが「71 + 5 = 76」という条件を満たすペアを含んでいるため、結果としてこの1行だけが出力されています。他のサブリストには合計が 76 になる2つの要素が存在しないため、フィルタリングによって除外されました。

この手法は、入れ子になったデータ構造から条件に合致するレコードを抽出したい場合など、さまざまな場面で応用できます。なお、大規模なデータを扱う場合は、itertools.combinations を活用するとより簡潔にペアを生成できるため、状況に応じて使い分けるとよいでしょう。

  1. Pythonでタプルのリストから組み合わせごとの合計を求める方法

    タプルのリストに含まれるタプル同士の組み合わせごとに合計を求めたい場合、itertoolsモジュールの「combinations」メソッドとリスト内包表記を組み合わせることで、簡潔に実現できます。 combinationsメソッドとは 「combinations」メソッドは、入力として渡されたイテラブル(反復可能オブジェクト)から、指定した長さ「r」の部分列をすべて返します。生成される組み合わせは辞書順(レキシコグラフィック順)に並べられ、ソートされた状態で表示されるのが特徴です。 なお、Pythonのリストは整数、浮動小数点数、文字列など、異なるデータ型の値(異種の値)を自由に格納できる柔軟

  2. Pythonでリストの累積和(累積合計)を求める方法

    この記事では、リストの累積和(累積合計)を求める問題の解決策について詳しく解説します。問題文あるリストが与えられたとき、各要素までの累積和を格納した新しいリストを作成する必要があります。例えば、[10, 20, 30, 40, 50] というリストが与えられた場合、出力は [10, 30, 60, 100, 150] となります。これは、各位置でそれ以前の要素をすべて足し合わせた値です。実装例それでは、実際の実装を見ていきましょう。# 累積和を求める関数 def Cumulative(l): new = [] cumsum = 0 for element in l: