整数のリスト内の合計の組み合わせを見つけようとしています。
合計を含む数値の量は変数によって制限されるため、たとえばリストでは -
[5,2,3,9,1]、数字が 2 つしかない 10 の合計を求めたいです。
プログラムが [9,1] を出力するようにします。
私はPythonを初めて使用していますが、簡単な方法はありますか?
ありがとうございました。
整数のリスト内の合計の組み合わせを見つけようとしています。
合計を含む数値の量は変数によって制限されるため、たとえばリストでは -
[5,2,3,9,1]、数字が 2 つしかない 10 の合計を求めたいです。
プログラムが [9,1] を出力するようにします。
私はPythonを初めて使用していますが、簡単な方法はありますか?
ありがとうございました。
from itertools import combinations
l = [5,2,3,9,1]
for var in combinations(l, 2):
if var[0] + var[1] == 10:
print var[0], var[1]
組み合わせtuples
は、反復可能なオブジェクト (ループできるオブジェクト) から可能なすべての組み合わせを作成します。実演してみましょう:
>>> [var for var in combinations([1,2,3,4,5], 2)]
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]
>>> [var for var in combinations([1,2,3,4,5], 3)]
[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)]
ls = [5, 2, 3, 9, 1]
sum = 10
while ls:
num = ls.pop()
diff = sum - num
if diff in ls:
print([num, diff])
を使用したブルートフォースアプローチitertools.combinations
:
In [6]: [pair for pair in itertools.combinations(li,2) if sum(pair) == 10]
Out[6]: [(9, 1)]
これにより、合計が 10 になるすべてのペアが得られます。これは実行時に超指数関数的であるため、入力が大きい場合は、より洗練されたアルゴリズムが必要になります。
コードゴルフの目的のためだけに、collections.Counter
アプローチは次のとおりです。
import collections
integers_list = [5,2,3,9,1]
integer_counts = collections.Counter(integers_list)
for x in integers_list:
y = 10 - x
if (x != y and integer_counts[y]) or (x == y and integer_counts[y] > 1):
print (x, y) # Or, if building a new list, append instead of print
integer_counts.subtract((x, y))
collections.Counter
2.7で追加されました。以前のバージョンでは、代わりに a を使用する必要がありましたdefaultdict
。それほど複雑ではありません。
これは @roippi が投稿したバージョンよりも読みにくいと思いますがitertools.combinations
、整数のリストが大きい場合は大幅に高速になるはずです。私は通常、コードを実行する機械の時間よりもコードを読む人間の時間を重視しますが、どちらの考慮事項が得られるかは、実際の状況によって異なります。
バージョンとは異なり、itertools
両方の要素が重複していない限り、これは重複したペアを返しません。例えば、[4, 3, 6, 6] のリストを考えてみましょう。バージョンは 2 つのitertools
異なる (4, 6) ペアを生成し、両方を返します。このバージョンでは、最初の 6 と一致するとすぐに 4 が消費されたと見なされ、1 つだけが返されます。複製が必要な場合は、 a のset
代わりに aCounter
が機能しますが、@ lollercoaster の回答に示されているように、セットを繰り返し構築しない限り、5 の特殊なケースはより複雑になります。
lst = [5,2,3,9,1]
lstLen = len(lst)
pair = 0
for i in range(lstLen):
for j in range(lstLen):
if(j <= i ): continue
if((lst[i] + lst[j]) == 10):
pair +=1
print "[%s, %s]" % (lst[i], lst[j])
print "number of pair = %s" % pair