9

テキスト ファイル内の数値の部分和を返すコードについて教えてください。テキスト ファイルをインポートしてから、ツールを使用せずに部分和のコードを作成する必要があります。

私の入力:

4
13
23
21
11

出力は次のようになります (括弧またはコンマなし)。

4 
17
40
61 
72

私はPythonでコードを作ろうとしていましたが、合計しかできず、部分的なものはできませんでした。ジェネレーターに演算子を使用する+=と、エラーが発生します!

4

7 に答える 7

22

さて、誰もが問題を解決するための好きなイディオムを挙げているように見えるので、Python 3 のitertools.accumulateはどうですか?

>>> import itertools
>>> nums = [4, 13, 23, 21, 11]
>>> list(itertools.accumulate(nums))
[4, 17, 40, 61, 72]
于 2012-11-04T19:23:46.957 に答える
13

一連の部分和を作成する方法はいくつかあります。最もエレガントなのはgeneratorを使用することだと思います。

def partial_sums(iterable):
    total = 0
    for i in iterable:
        total += i
        yield total

次のように実行できます。

nums = [4, 13, 23, 21, 11]
sums = list(partial_sums(nums)) # [ 4, 17, 40, 61, 72]

編集ファイルからデータ値を読み取るには、別のジェネレーターを使用して、それらを連鎖させることができます。これが私がそれを行う方法です:

with open("filename.in") as f_in:
    # Sums generator that "feeds" from a generator expression that reads the file
    sums = partial_sums(int(line) for line in f_in)

    # Do output:
    for value in sums:
        print(value)

    # If you need to write to a file, comment the loop above and uncomment this:
    # with open("filename.out", "w") as f_out:
    #    f_out.writelines("%d\n" % value for value in sums)
于 2012-11-04T19:20:18.967 に答える
5

numpy.cumsumあなたが望むことをします。

を使用していない場合はnumpy、独自に作成できます。

def cumsum(i):
    s = 0
    for elt in i:
        s += elt
        yield s
于 2012-11-04T19:17:15.317 に答える
2

numpy で累積合計を使用します。

import numpy as np
input = np.array([4, 13, 23, 21 ,11])
output = input.cumsum()

結果:

print output
>>>array([ 4, 17, 40, 61, 72])

または、リストが必要な場合は、出力をリストに変換できます。

output = list(output)
print output
>>>[4, 17, 40, 61, 72]
于 2014-07-31T20:53:43.757 に答える
2

これを試して:

import numpy as np

input = [ 4, 13, 23, 21, 11 ]
output = []
output.append(input[0])
for i in np.arange(1,len(input)):
    output.append(input[i] + input[i-1])

print output
于 2012-11-04T19:23:42.167 に答える
1

このようなもの:

>>> lst = [4, 13, 23, 21 ,11]
>>> [sum(lst[:i+1]) for i, x in enumerate(lst)]
[4, 17, 40, 61, 72]
于 2012-11-04T19:16:55.143 に答える
1

これはreduceを使用した代替ソリューションです。

nums = [4, 13, 23, 21, 11]
partial_sum = lambda a, b: a + [a[-1] + b]
sums = reduce(partial_sum, nums[1:], nums[0:1])

ラムダのプラスは同じ演算子ではありません.最初のものはリスト連結であり、2番目のものは2つの整数の合計です. Blckknght の方がわかりやすいかもしれませんが、こちらの方が短く、Python 2.7 で動作します。

于 2014-07-31T20:40:26.100 に答える