2017-01-18 3 views
0

たとえば、4.5のソリューションがあり、それぞれ10個の実数のリストが2つある場合、各位置(1st n、2nd n 、3rd n ..)両方のリストからのエントリの1つだけがエントリごとに使用できます。このルールに従ったすべての組み合わせを見つける必要があります。これは解の数に等しくなります。Pythonを使用して2つの可能性のうちの1つを使ってリストアイテムの合計を見つける方法

例えば:溶液番号= 4.5

第1数が0.75又は0.1のいずれかであり得る、 2数はいずれであってもよい0.35または0.05、 3数はいずれか .... 10の数であることができるが、いずれであってもよいです0.05または0.03である。

は、どのように私は、各位置が位置ごとに2つのオプションのいずれかであること、一度に含まれている可能性のある組み合わせのすべてを見つけることができます。

答えて

2

要素の数が比較的少ない場合は、itertools.productを使用して可能なすべての選択を生成し、合計を調べることができます。たとえば、私たちはその後、

from itertools import product 
choices = zip(*lists) 
solutions = [p for p in product(*choices) if abs(sum(p)-target) < tol] 

が与え

lists = [[0.75, 0.35, 0.05], [0.1, 0.05, 0.03]] 
target = 0.83 
tol = 0.001 

で始まる場合zip(*lists)は私たちが唯一のものを作ることができ、各選択肢を記述するタプル与えるので、これは動作します

>>> solutions 
[(0.75, 0.05, 0.03)] 

>>> list(zip(*lists)) 
[(0.75, 0.1), (0.35, 0.05), (0.05, 0.03)] 

、その後productは私たちの選択肢の可能なすべてのグループを与える:リストのサイズが大きくなるが、彼らは短いしている場合、それはだとして力まかせ探索のこの種は非常に迅速に実行不可能になることを

>>> list(product(*zip(*lists))) 
[(0.75, 0.35, 0.05), (0.75, 0.35, 0.03), (0.75, 0.05, 0.05), (0.75, 0.05, 0.03), (0.1, 0.35, 0.05), (0.1, 0.35, 0.03),] 

注意を悪くない。あなただけの任意のソリューションを見つけることを気にしている場合は、できるだけ早く1が検出されたとして停止する

>>> next(p for p in product(*choices) if abs(sum(p)-target) < tol) 
(0.75, 0.05, 0.03) 

を行うことができます。

+0

ありがとうございました!パーフェクト – McLeodx

関連する問題