「言語処理100本ノック」 第2章をPythonで解く
言語処理100本ノックの2章を解きました。 2章は、ファイル操作に関する問題です。 解答例としてどうぞ。質問,ご指摘などがありましたら、コメントしてください。
言語処理100本ノック第2章
10. 行数のカウント
行数をカウントせよ.確認にはwcコマンドを用いよ
file = open('hightemp.txt') lines = file.readlines() file.close() print(len(lines))
pythonでは、file.readlines()
により、一行が一つの要素として配列に格納されるため、配列の要素数が行数になります。
11. タブをスペースに置換
タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.
file = open('hightemp.txt') lines = file.read() lines = lines.replace('\t', ' ')
replace('\t', ' ')
でタブをスペースに変換します。
12. 1列目をcol1.txtに,2列目をcol2.txtに保存
「各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.
file = open('hightemp.txt') lines = file.readlines() file1 = lines[0] file2 = lines[1] with open('./files/chapter2/col1.txt', 'a') as col1: col1.write(file1) with open('./files/chapter2/col2.txt', 'a') as col2: col2.write(file2)
どちらの単語も4文字なので、forループ4回で終了です。
13. col1.txtとcol2.txtをマージ
"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.
file1 = open('./files/chapter2/col1.txt') file2 = open('./files/chapter2/col2.txt') col1 = file1.read() col2 = file2.read() with open('./files/chapter2/merge.txt', 'a') as merge: merge.write(col1) merge.write(col2)
14. 先頭からN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.
N = int(input()) if N > 24: print('24以下の数字でお願いします') else: file = open('hightemp.txt') lines = file.readlines() i = 0 for line in lines: if i >= N: break print(line) i += 1
15. 末尾のN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.
N = int(input()) if N > 24: print('24以下の数字でお願いします') else: file = open('hightemp.txt') lines = file.readlines() for i in range(len(lines)): if i >= N: break print(Lines[-i-1])
16. ファイルをN分割する
自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.
import math N = int(input()) with open('hightemp.txt', 'r') as file: lines = file.readlines() count = len(lines) // N i = 1 number = 1 text = '' for line in lines: text += line if number < N: if i % count == 0 or i == len(lines): with open('split_file_{}.txt'.format(number), 'w') as split_file: split_file.write(text) number += 1 text = '' else: if i == len(lines): with open('split_file_{}.txt'.format(number), 'w') as split_file: split_file.write(text)
17. 1列目の文字列の異なり
1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはsort, uniqコマンドを用いよ.
file = open('hightemp.txt') lines = file.readlines() results = [] for line in lines: line = line.split("\t") if line[0] not in results: results.append(line[0]) for result in results: print(result)
18. 各行を3コラム目の数値の降順にソート
各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).
file = open('hightemp.txt') lines = file.readlines() results = [] for line in lines: line = line.split("\t") results.append(line) results = sorted(results, key=lambda x: x[2], reverse=True) for result in results: print(result)
19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.
file = open('./files/chapter2/hightemp.txt') lines = file.readlines() count_dict = {} for line in lines: line = line.split("\t") if line[0] in count_dict: count_dict[line[0]] += 1 else: count_dict[line[0]] = 1 results = sorted(count_dict, key=lambda x: x[1], reverse=True) for result in results: print(result)