kNakajima's Blog

技術系のアウトプットブログです。

「言語処理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)