7

整数のリスト内の合計の組み合わせを見つけようとしています。

合計を含む数値の量は変数によって制限されるため、たとえばリストでは -

[5,2,3,9,1]、数字が 2 つしかない 10 の合計を求めたいです。

プログラムが [9,1] を出力するようにします。

私はPythonを初めて使用していますが、簡単な方法はありますか?

ありがとうございました。

4

7 に答える 7

10
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)]
于 2013-10-25T21:02:14.307 に答える
3
ls = [5, 2, 3, 9, 1]
sum = 10

while ls:
    num = ls.pop()
    diff = sum - num
    if diff in ls:
        print([num, diff])
于 2013-10-25T21:06:18.107 に答える
3

を使用したブルートフォースアプローチitertools.combinations:

In [6]: [pair for pair in itertools.combinations(li,2) if sum(pair) == 10]
Out[6]: [(9, 1)]

これにより、合計が 10 になるすべてのペアが得られます。これは実行時に超指数関数的であるため、入力が大きい場合は、より洗練されたアルゴリズムが必要になります。

于 2013-10-25T20:58:14.910 に答える
2

コードゴルフの目的のためだけに、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.Counter2.7で追加されました。以前のバージョンでは、代わりに a を使用する必要がありましたdefaultdict。それほど複雑ではありません。

これは @roippi が投稿したバージョンよりも読みにくいと思いますがitertools.combinations、整数のリストが大きい場合は大幅に高速になるはずです。私は通常、コードを実行する機械の時間よりもコードを読む人間の時間を重視しますが、どちらの考慮事項が得られるかは、実際の状況によって異なります。

バージョンとは異なり、itertools両方の要素が重複していない限り、これは重複したペアを返しません。例えば、[4, 3, 6, 6] のリストを考えてみましょう。バージョンは 2 つのitertools異なる (4, 6) ペアを生成し、両方を返します。このバージョンでは、最初の 6 と一致するとすぐに 4 が消費されたと見なされ、1 つだけが返されます。複製が必要な場合は、 a のset代わりに aCounterが機能しますが、@ lollercoaster の回答に示されているように、セットを繰り返し構築しない限り、5 の特殊なケースはより複雑になります。

于 2013-10-25T21:07:26.210 に答える
0
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
于 2014-09-03T22:17:44.097 に答える