星期日, 1月 23, 2011

小試牛刀 - 算出檔案每一列的總和

今天處理程式的時候,遇到一個很簡單的檔案,長的如下

19 2 1 1 1
6 2 0 0 0
1 2 0 0 0
3 2 0 0 0
3 1 0 0 0
4 2 2 2 2
...

每一行代表一筆資料,然而,我想要得到每一列的總和。這其實是一個很簡單不過的題目,大一程式設計就可以寫的出來 XD。那麼有趣之處是什麼 XD? 如果我用 Python 來撰寫的話,要怎麼樣才可以寫的很有趣 ?

首先是讀檔,轉換資料成一個 list。我不打算浪費太多時間在寫這個方面,所以我是用暴力法撰寫。

f = open('filename.txt', 'r')
data = [[int(d) for d in l.split()] for l in f.readlines()]
f.close()

這樣子我們可以得到一個 list of list,每一個 element 的 type 皆為 integer,所以問題是,如何得到每一行的縱向總和 ? 直覺方式是雙層迴圈來搞定,這可能是最快也最直接想到的方法,不過我不想要,因為我覺得這實在是不美好 XD。就我的想法是,我當下想到的是 fold, fold list of list to a list. 稍微想了一下,就寫出了下面這行 code

sum_list = reduce(lambda x, y: [u+v for u, v in zip(x,y)], data)

其實用 Haskell 寫會更漂亮 ... 不過我還沒學 monad ... Orz (趕快學!!)


---
臨時筆記 XD

4 則留言:

Lin Jen-Shin (godfat) 提到...

ruby one linear :p

$stdin.lines.map{ |l| l.split.map(&:to_i) }.transpose.map{ |c| c.inject(&:+) }

hamigwa 提到...

matlab(毆)o

Unknown 提到...

My Haskell solution:

import Data.List
main = interact $ intercalate " " . map (show . sum) . transpose . map (map read . words) . lines

Unknown 提到...

fyi. my solution updated at:
http://davidtran.doublegifts.com/blog/?p=167