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

Pythonで2つのリストのデカルト積(直積)を求める方法

2つのデータリスト l1l2 が与えられたとき、これらのデカルト積(直積)を求めることを考えます。デカルト積とは、2つのリストの要素をすべて組み合わせたペアの集合のことです。例えば、リストが (a, b)(c, d) の場合、デカルト積は {(a, c), (a, d), (b, c), (b, d)} のようになります。

Pythonでは、標準ライブラリの itertools モジュールに含まれる product() 関数を使うことで、この処理を非常に簡単に実装できます。product() 関数はイテレータを返すため、list() コンストラクタに渡してリスト形式に変換する必要があります。

例えば、入力が l1 = [1, 5, 6]l2 = [1, 2, 9] の場合、出力は次のようになります。

[(1, 1), (1, 2), (1, 9), (5, 1), (5, 2), (5, 9), (6, 1), (6, 2), (6, 9)]

解決手順

この問題を解くには、以下の手順に従います。

  • x := product(l1, l2) — デカルト積のイテレータを取得します
  • ret := list(x) — イテレータ x をリストに変換します
  • return ret — 結果のリストを返します

実装例

以下のコードで実際の動作を確認してみましょう。

from itertools import product

def solve(l1, l2):
   return list(product(l1, l2))

l1 = [1, 5, 6]
l2 = [1, 2, 9]
print(solve(l1, l2))

入力

[1, 5, 6], [1, 2, 9]

出力

[(1, 1), (1, 2), (1, 9), (5, 1), (5, 2), (5, 9), (6, 1), (6, 2), (6, 9)]

補足:同じリスト同士の組み合わせも求められる

product() 関数には repeat 引数があり、product(l1, repeat=2) のように指定すると、同じリスト内の要素から重複順列(同じリスト同士のデカルト積)を生成できます。また、3つ以上のリストを渡すことも可能なので、多次元の組み合わせが必要な場面でも活用できます。計算量は各リストの要素数の積になるため、大きなデータセットを扱う際は注意しましょう。

  1. Pythonで2つの長方形が覆う総面積を求めるプログラム

    2次元平面上に置かれた2つの長方形が覆う総面積を求めたい場面を考えてみましょう。各長方形は、左下の頂点と右上の頂点の座標によって定義されます。1つ目の長方形の左下・右上の座標をそれぞれ (A, B)、(C, D)、2つ目の長方形のそれらを (E, F)、(G, H) とします。解き方のアプローチこの問題は、以下の手順で解くことができます。まず、それぞれの長方形の幅と高さを求めます。width_1 := |C − A|、height_1 := |D − B|width_2 := |G − E|、height_2 := |H − F|2つの長方形の面積を合計します。area := width_1

  2. Pythonで数値が2の累乗かどうかを判定するプログラム

    本記事では、与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法について、考え方と実装手順をわかりやすく解説します。 問題の定義 ある整数 n が与えられたとき、その数が2の累乗(1, 2, 4, 8, 16, …)であるかどうかを判定します。 アプローチ 判定には「繰り返し2で割る」というシンプルな方法を使います。考え方は以下の通りです。 入力された数値 n を、1になるまで繰り返し2で割っていきます(n = n // 2)。 割る過程で n % 2 の結果が0以外(奇数)になり、かつ n が1でない場合は、その数は2の累乗ではありません。 最終的に n がちょうど1になれば、そ