Pythonでi+j+kがnと異なるトリプレットのリストをリスト内包表記で求める方法
3つの数 i、j、k と、もう1つの数 n が与えられているとします。このとき、「i+j+k が n と等しくない」条件を満たすすべてのトリプレット (x, y, z) のリストを作成するのが課題です。この問題は、Pythonのリスト内包表記を使うことで、簡潔かつ効率的に解くことができます。
例えば、入力が i = 1、j = 1、k = 2、n = 3 の場合、出力は次のようになります。
[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 2]]
解法のアプローチ
この問題を解くための手順は以下の通りです。
x を 0〜i の範囲、y を 0〜j の範囲、z を 0〜k の範囲で順に動かす
x+y+z が n と異なる場合にのみ、トリプレット [x, y, z] を配列 arr に追加する
最終的に完成した配列 arr を返す
これらの処理は、三重のforループをネストしたリスト内包表記にまとめることで、たった1行で記述できます。
実装例
それでは、実際のコードを見て理解を深めましょう。
def solve(i, j, k, n):
arr = [[x, y, z] for x in range(i+1) for y in range(j+1) for z in range(k+1) if x+y+z != n]
return arr
i = 1
j = 1
k = 2
n = 3
print(solve(i, j, k, n))
コードのポイント
range(i+1)としているのは、0からiまで(iを含む)の値を走査するためです。j、kについても同様です。if x+y+z != nの条件節により、合計がnと一致する組み合わせだけが除外されます。条件を満たす組み合わせのみがリストに格納されるため、余分なメモリや処理が発生しません。
入力
1, 1, 2, 3
出力
[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 2]]
なお、全組み合わせの数は (i+1) × (j+1) × (k+1) 個あり、そのうち合計がnと一致するものが除外されます。上記の例では全12通りのうち3通り([0, 1, 2]、[1, 0, 2]、[1, 1, 1])が除外され、9個のトリプレットが出力されています。
-
Pythonでリスト内の最小値を見つける方法を解説
この記事では、リストの中から最小の数値を見つける方法について、具体的なサンプルコードとともに詳しく解説します。問題の概要問題: 数値のリストが与えられたとき、その中に含まれる最も小さい数値を画面に表示すること。この問題を解くアプローチは主に2つあります。ひとつは sort() メソッドを使ってリストを昇順に並べ替え、先頭の要素(インデックス0)を取得する方法。もうひとつは、Pythonに標準で用意されている組み込み関数 min() を使う方法です。それぞれ順番に見ていきましょう。方法1:sort()メソッドで並べ替えて最小値を取得するまずはリストを昇順にソートし、先頭の要素を取り出す方法です。
-
Pythonでリストの累積和(累積合計)を求める方法
この記事では、リストの累積和(累積合計)を求める問題の解決策について詳しく解説します。問題文あるリストが与えられたとき、各要素までの累積和を格納した新しいリストを作成する必要があります。例えば、[10, 20, 30, 40, 50] というリストが与えられた場合、出力は [10, 30, 60, 100, 150] となります。これは、各位置でそれ以前の要素をすべて足し合わせた値です。実装例それでは、実際の実装を見ていきましょう。# 累積和を求める関数 def Cumulative(l): new = [] cumsum = 0 for element in l: