2012-11-04 22 views
7

können Sie mir mit Code helfen, der Teilsumme von Zahlen in Textdatei zurückgibt? Ich muss Textdatei importieren, dann einen Code für Teilsummen ohne Werkzeuge machen .. etc.Python: Partielle Summe von Zahlen

Mein Eingang:

4 
13 
23 
21 
11 

Der Ausgang (ohne Klammern oder Kommas) sein sollte:

4 
17 
40 
61 
72 

Ich habe versucht, Code in Python zu machen, aber nur Gesamtsumme tun könnte und nicht Teil ein. Wenn ich den += Operator für Generator verwende, gibt es mir einen Fehler!

+1

Haben Sie eine wollen Array-Ergebnis oder nur gedruckte Ausgabe? – BobS

+0

Siehe: 'reduzieren (Lambda c, x: c + [c [-1] + x], [4, 13, 23, 21, 11], [0]) [1:]' –

Antwort

2

etwas wie folgt aus:

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

-1 Dies berechnet ' sum ([4]) ', dann' sum ([4,13]) ', dann' sum ([4,13,23]) 'usw. - den Punkt zu besiegen, an dem eine kumulative Summe genommen wird! – katrielalex

+6

Ich würde nicht sagen, dass es den Zweck besiegt. Es ist ein ineffizienter Weg, es zu berechnen (O (n^2) anstelle von O (n)), aber es erhält die richtige Antwort. – DSM

3

numpy.cumsum wird tun, was Sie wollen.

Wenn Sie nicht numpy verwenden, können Sie Ihre eigenen schreiben.

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

Ich denke nicht, eine Abhängigkeit von numpy hinzuzufügen, ist eine gute Idee, es sei denn, er benutzt sie bereits. – ThiefMaster

12

Es gibt eine Reihe von Möglichkeiten, Ihre Sequenz von Partialsummen zu erstellen. Ich denke, am elegantesten ist es, eine generator zu verwenden.

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

Sie können es wie folgt aus:

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

bearbeiten Um die Datenwerte aus der Datei zu lesen, können Sie einen weiteren Generator verwenden können, und verketten sie zusammen. Hier ist, wie ich es tun würde:

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

Dies ist wahrscheinlich die nützlichste Antwort für das OP. – DSM

+1

Das hat es geschafft! Ich danke Ihnen lieber Herr! – user1798558

+0

@ user1798558: Wenn diese Antwort Ihnen geholfen hat, können Sie dem Autor danken, indem Sie das grüne Häkchen auf der linken Seite markieren (siehe [hier] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an (Answer-Arbeit) für Anweisungen.) – DSM

2

try this:

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

Nun, da jeder scheint für die Lösung des Problems ihre Lieblings Idiom zu geben, wie etwa itertools.accumulate in Python 3:

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

Hinweis: "neu in Version 3.2". Interessante Ergänzung. :) –

+2

@hayden: es ist noch besser in 3.3. 3.2 akzeptiert keinen Funktionsparameter. – DSM

+0

Ich mag besonders, wie 'total = next (it)' mit dem '[]' case behandelt ... –

0

Dies ist eine alternative Lösung reduce mit:

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

Plus in Lambda sind nicht derselbe Operator, der erste ist Listenverkettung und der zweite ist die Summe zweier Ganzzahlen. Obwohl Blckknghts klarer ist, ist dieser kürzer und funktioniert in Python 2.7.

1

Verwenden kumulative Summe in numpy:

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

Ergebnis:

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

Oder wenn Sie eine Liste benötigen, können Sie die Ausgabe auf Liste konvertieren:

output = list(output) 
print output 
>>>[4, 17, 40, 61, 72] 
Verwandte Themen