Pythonで2つのリストのデカルト積(直積)を求める方法
2つのデータリスト l1 と l2 が与えられたとき、これらのデカルト積(直積)を求めることを考えます。デカルト積とは、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つ以上のリストを渡すことも可能なので、多次元の組み合わせが必要な場面でも活用できます。計算量は各リストの要素数の積になるため、大きなデータセットを扱う際は注意しましょう。
-
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
-
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になれば、そ