2012-11-04 14 views
7

テキストファイルの数値の部分和を返すコードを教えてもらえますか? テキストファイルをインポートしてから、ツールなどを使わない部分和のコードを作成する必要があります。Python:数値の部分和

マイ入力:

4 
13 
23 
21 
11 

出力は(括弧やカンマなし)でなければなりません:

4 
17 
40 
61 
72 

私はPythonでコードを作成しようとしていたが、一部のみの総和を行うとことができませんでした1。 発電機に+=演算子を使用すると、エラーが発生します。このような

+1

は、あなたがしたいですか配列の結果、または単に印刷された出力? – BobS

+0

以下のようになります: 'reduce(lambda c、x:c + [c [-1] + x]、[4,13,23,21,11]、[0])[1:]' –

答えて

2

何か:

>>> lis=[4, 13, 23, 21 ,11] 
>>> [sum(lis[:i+1]) for i,x in enumerate(lis)] 
[4, 17, 40, 61, 72] 
+2

-1 '累計([4,13])、合計([4,13,23])など - 累積合計を取る点を倒す! – katrielalex

+6

私はそれが目的を破るとは言いません。それを計算するのは非効率的です(O(n)の代わりにO(n^2))が正しい答えを得ます。 – DSM

3

numpy.cumsumは、あなたがやりたいだろう。

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

def cumsum(i): 
    s = 0 
    for elt in i: 
     s += elt 
     yield s 
+4

numpyに依存関係を追加することは、彼がすでにそれを使用していない限り、良い考えではないと思います。 – ThiefMaster

12

部分和のシーケンスを作成するには、いくつかの方法があります。最もエレガントなのは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) 
+0

これは、おそらくOPのための最も有用な答えです。 – DSM

+1

それはそれをしました!あなたの親切な先生に感謝! – user1798558

+0

@ user1798558:この回答が役に立ちましたら、左側の緑のチェックマークを選択して作者に感謝してください([こちら](http://meta.stackexchange.com/questions/5234/how-does-accepting-anを参照) -answer-work)を参照してください。) – DSM

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 
13

まあ、誰もが問題を解決するために自分の好きなイディオムを与えているように見えることから、どの程度itertools.accumulate Pythonの3:

>>> import itertools 
>>> nums = [4, 13, 23, 21, 11] 
>>> list(itertools.accumulate(nums)) 
[4, 17, 40, 61, 72] 
+0

注:「バージョン3.2で新機能」興味深い追加。 :) –

+2

@hayden:それは3.3でさらに良いです。 3.2は関数パラメータを受け付けません。 – DSM

+0

私は特に 'total '(next)'が '[]'の場合をどう扱うか好きです... –

0

これは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]) 

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

1

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] 
関連する問題