2012-11-04 40 views
7

bạn có thể giúp tôi với mã trả về một phần tổng số trong tệp văn bản không? Tôi phải nhập tệp văn bản, sau đó tạo mã cho khoản tiền một phần mà không cần công cụ ..etc.Python: Tổng số một phần của số

đầu vào của tôi:

4 
13 
23 
21 
11 

Đầu ra phải được (không có dấu ngoặc hoặc dấu phẩy):

4 
17 
40 
61 
72 

Tôi đã cố gắng để làm mã trong python, nhưng chỉ có thể làm tổng và không một phần một. Nếu tôi sử dụng toán tử += cho trình tạo, nó cho tôi một lỗi!

+1

Bạn có muốn một kết quả mảng, hoặc chỉ in đầu ra? – BobS

+0

Kìa: 'giảm ​​(lambda c, x: c + [c [-1] + x], [4, 13, 23, 21, 11], [0]) [1:]' –

Trả lời

2

một cái gì đó như thế này:

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

-1 Tính toán này ' tổng ([4]) ', sau đó' tổng hợp ([4,13]) ', sau đó' tổng ([4,13,23]) ', v.v. - đánh bại điểm lấy tổng tích lũy! – katrielalex

+6

Tôi sẽ không nói rằng nó đánh bại mục đích. Đó là một cách không hiệu quả để tính toán nó (O (n^2) thay vì O (n)) nhưng nó nhận được câu trả lời đúng. – DSM

3

numpy.cumsum sẽ làm những gì bạn muốn.

Nếu bạn không sử dụng numpy, bạn có thể tự viết.

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

Tôi không nghĩ rằng việc thêm một phụ thuộc vào sự khó khăn là một ý tưởng hay trừ khi anh ta đã sử dụng nó. – ThiefMaster

12

Có một số cách để tạo chuỗi các khoản tiền một phần của bạn. Tôi nghĩ rằng thanh lịch nhất là sử dụng generator.

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

Bạn có thể chạy nó như thế này:

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

Sửa Để đọc các giá trị dữ liệu từ tập tin, bạn có thể sử dụng máy phát điện khác, và chuỗi chúng lại với nhau. Đây là cách tôi muốn làm điều đó:

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

Đây có lẽ là câu trả lời hữu ích nhất cho OP. – DSM

+1

Điều đó đã làm được! Cảm ơn bạn loại sir! – user1798558

+0

@ user1798558: nếu câu trả lời này giúp bạn, bạn có thể cảm ơn tác giả bằng cách chọn dấu kiểm màu xanh lá cây ở bên trái (xem [tại đây] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an -answer-work) để được hướng dẫn.) – DSM

2

thử điều này:

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

Vâng, vì tất cả mọi người dường như được đưa ra thành ngữ yêu thích của họ để giải quyết vấn đề, làm thế nào về itertools.accumulate bằng Python 3:

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

Lưu ý: "mới trong phiên bản 3.2". Thú vị bổ sung. :) –

+2

@hayden: nó thậm chí còn tốt hơn trong 3.3. 3.2 không chấp nhận tham số hàm. – DSM

+0

Tôi đặc biệt thích cách 'total = next (it)' giao dịch với trường hợp '[]' ... –

0

Đây là một giải pháp thay thế sử dụng 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]) 

Điểm cộng trong lambda không phải là toán tử giống nhau, đầu tiên là danh sách nối và phần tử thứ hai là tổng của hai số nguyên. Altough Blckknght có thể rõ ràng hơn, cái này ngắn hơn và hoạt động trong Python 2.7.

1

Sử dụng số tiền tích lũy trong NumPy:

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

Kết quả:

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

Hoặc nếu bạn cần một danh sách, bạn có thể chuyển đổi sản lượng vào danh sách:

output = list(output) 
print output 
>>>[4, 17, 40, 61, 72] 
Các vấn đề liên quan