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

指定した合計値となる長さKのグループを取得するPythonプログラム

特定の合計値となる長さ「K」のグループを取得したい場合、空のリストと、itertoolsモジュールの「product」メソッド、組み込みの「sum」メソッド、「append」メソッドを組み合わせて使用できます。

サンプルコード

以下に実際の動作例を示します。

from itertools import product

my_list = [45, 32, 67, 11, 88, 90, 87, 33, 45, 32]
print("The list is : ")
print(my_list)

N = 77
print("The value of N is ")
print(N)
K = 2
print("The value of K is ")
print(K)

my_result = []
for sub in product(my_list, repeat = K):
   if sum(sub) == N:
      my_result.append(sub)

print("The result is : " )
print(my_result)

出力

The list is :
[45, 32, 67, 11, 88, 90, 87, 33, 45, 32]
The value of N is
77
The value of K is
2
The result is :
[(45, 32), (45, 32), (32, 45), (32, 45), (45, 32), (45, 32), (32, 45), (32, 45)]

解説

  • まず、必要なパッケージ(itertools)を環境にインポートします。

  • 対象となるリストを定義し、コンソールに表示します。

  • 目標となる合計値Nと、グループの長さKを定義し、コンソールに表示します。

  • 結果を格納するための空のリストを用意します。

  • productメソッド(repeat=K)を使うことで、リストの要素から重複を許して選んだ長さKのタプルをすべて生成し、その合計がNと一致するかどうかをsumメソッドで確認します。

  • 条件に一致したタプルは、appendメソッドによって結果リストへ追加されます。

  • 最後に、得られた結果をコンソールに出力します。

補足:重複を除去したい場合

出力例を見ると、(45, 32) や (32, 45) のように同じ組み合わせが複数回現れています。これは、productが順序を区別する組み合わせ(順列)を生成するためです。もし重複を取り除きたい場合は、set() を使って次のように書き換えることができます。

my_result = list(set(sub for sub in product(my_list, repeat=K) if sum(sub) == N))
print(my_result)

このようにすることで、順序の異なる同一組み合わせが1つにまとめられ、より見やすい結果を得られます。なお、要素数が多いリストや大きなKに対しては、productが生成する組み合わせの総数が急激に増えるため、処理時間に注意が必要です。

  1. 対角線の長さから正六角形の面積を求めるC++プログラム

    この記事では、対角線の長さがわかっている場合に、正六角形の面積を計算する方法を解説します。ここでは対角線の長さを d とします。正六角形の内角はそれぞれ 120° であり、すべての内角の合計は 720° になります。対角線の長さが d のとき、面積は以下の公式で求められます。面積の公式正六角形の対角線 d を使った面積の式は次のとおりです。面積 = (3√3 × d²) / 8この式では、対角線の2乗に 3√3 を掛け、8 で割ることで面積が得られます。入力値が負の場合は無効な値として扱うため、プログラム側でチェックを行っています。サンプルコード(C++)#include <iostre

  2. Pythonで指定されたインデックスに基づいて文字列をシャッフルする方法

    文字列 s とインデックスのリスト ind が与えられ、両者は同じ長さであるとします。文字列 s は、位置 i にある文字が最終的な文字列内の ind[i] の位置へ移動するようにシャッフルされます。このとき、シャッフル後の最終的な文字列を求める必要があります。例えば、入力が s = ktoalak、ind = [0,5,1,6,2,4,3] の場合、出力は kolkata となります。解決手順この問題を解くには、以下の手順に従います。fin_str を s と同じサイズのリストとして作成し、0で初期化するs 内の各インデックス i と各文字 v に対して、次の操作を行うfin_str[ind