2017-10-08 34 views
0

私は整数のリストを持っています。これらの数字のうちの3つを含むすべての組み合わせを作成し、出力はこれらの組み合わせの合計を含むリストです。 (すべての組み合わせをまとめてはいませんが、それぞれの組み合わせに対して1つの合計)整数の組み合わせをこれらの組み合わせの合計のリストに変換する

私のアルゴリズムは、すべての可能な組み合わせをリストし、各組み合わせの数を合計してリストに保存します。整数の数が多い場合。ここにはPythonの小さなサンプルがあります:

import itertools 

array=[1,2,3,4] 
combs=[] 

els = [list(x) for x in itertools.combinations(array, 3)] 
combs.extend(els) 
result=list(map(sum, combs)) 

もう少し効果的な解決策を考え出してください。たぶん、組み合わせのリストを最初に作っておらず、それぞれの組み合わせの数を2番目に集計していないループにする方法があれば、ちょうど作成した組み合わせの合計を数えてリストに保存してからすべての組み合わせと合計が行われるまで、もう1つ。

+3

なぜドンあなたはちょうど '[sum(x)for ...]'にまっすぐ行くのですか?タプルをリストに変換すると、リストのリストがリストの新しいリストに、次に別の新しい整数リストに、全く無意味に見えます。 – jonrsharpe

+1

"combination"コンポーネントを削除することなく、大きなnに対してこれを効率的にすることはできません。これは性質上非効率的です([combinatorial explosion](https://en.wikipedia.org/wiki/Combinatorial_explosion)を参照)。あなたの問題に対して別のアプローチが必要です。しかし、そのためにはまず問題を定義する必要があります。 – ayhan

+0

あなたがリストを作るのを避けることができれば良いです。ロジックを再編成して、生成された各金額を操作できるかどうかを確認してください。例えば、マップ内の(sum、combinations(array、3)):do_stuff(s) –

答えて

0

sum()は、リストだけでなく、どのような繰り返しでも動作します。あなたが遅延し、結果を処理したい場合は、

result = [sum(c) for c in itertools.combinations(array, 3)] 

あなたにもジェネレータ式を使用することができます:あなたは、組み合わせタプルに直接適用することにより、コードをより効率的に作ることができる

result = (sum(c) for c in itertools.combinations(array, 3))