以前書いた「文章内の単語数を調べる関数」も、文字列のsplit関数とfilter関数の組み合わせで簡単に書き直せた。ちなみにsplit関数とは、文字列を指定した区切り文字で分割し、それぞれをリストの要素として返す関数である。今回は与えられた文字列を空白で分割するようにしている。
def countwords(s): return len(filter((lambda c: c != ''),s.split(' ')))
これを応用して、今度はあるファイル内にある単語数を調べる関数を作成してみる。引数はファイルパス。
def countwords(s): return len(filter((lambda c: c != '' and c != '\n'),s.split(' '))) def countwordsinfile(file): L = map(countwords,open(file).readlines()) return reduce((lambda x,y: x + y),L)
countwords関数を少しいじったのは、例えば改行だけの行があったときに1文字と認識されてしまう現象が起きたため。open(file).readlines()はファイル内の全ての行をリストの形で返してくれる便利な関数。map関数でそれぞれに行に対してcountwords関数で単語数を調べ、最後にreduce関数で各要素を足していく。
読むファイルは以下。改行コードとEOFは表現のしようがなかったので、とりあえず手書きで加えておきました。
news.txt
The declaration came after the deaths of at least seven Palestinian civilians on a Gaza beach\n from an apparently errant Israeli artillery shell.\n \n Delphi expanded its buyout deal to include all U.A.W. members, signaling a stepped-up effort\n to avoid a strike.\n [EOF]
実行結果。
>>> countwordsinfile('news.txt') 41
一つの単語がcondi- tion と二行に亘る場合などに対応できてませんが、とりあえず出来ましたね。