ハイファットマンの友人M

ハイファットマンはおともだちです。ほぼメモ

言語処理100本ノック(その5)

前回の続きから

第2章 15から

15. 末尾のN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

print('自然数を入力')
input_num = int(input())

file_list = open('hightemp.txt').readlines()
for line in file_list[len(file_list)- input_num:]:
    print(line, end='')

実行結果

$ python 15.py
自然数を入力
3
山梨県   大月  39.9    1990-07-19
山形県   鶴岡  39.9    1978-08-03
愛知県   名古屋   39.9    1942-08-02

tailコマンドの実行結果

$ tail -n 3 chapter2/hightemp.txt
山梨県   大月  39.9    1990-07-19
山形県   鶴岡  39.9    1978-08-03
愛知県   名古屋   39.9    1942-08-02

16. ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

import math

print('自然数を入力')
input_num = int(input())

file_list = open('hightemp.txt').readlines()
file_size = math.ceil(len(file_list) / input_num)
for n in range(0, file_size):
    f = open(str(n+1)+'.txt', 'w')
    f.write(''.join(file_list[n*input_num:(n+1)*input_num:1]))
    f.close()
  • file_size = 作成するファイルの数
  • file_list[start:end:step]をファイルに出力

実行結果

$ python 16.py
自然数を入力
10
$ ls *.txt
1.txt  2.txt  3.txt  col1.txt  col2.txt  hightemp.txt
$ cat 1.txt
高知県   江川崎   41  2013-08-12
埼玉県   熊谷  40.9    2007-08-16
岐阜県   多治見   40.9    2007-08-16
山形県   山形  40.8    1933-07-25
山梨県   甲府  40.7    2013-08-10
和歌山県    かつらぎ    40.6    1994-08-08
静岡県   天竜  40.6    1994-08-04
山梨県   勝沼  40.5    2013-08-10
埼玉県   越谷  40.4    2007-08-16
群馬県   館林  40.3    2007-08-16

col1.txt col2.txtは関係ないファイルです。

splitコマンドの実行結果

$ ls x*
xaa  xab  xac
$ cat xaa
高知県   江川崎   41  2013-08-12
埼玉県   熊谷  40.9    2007-08-16
岐阜県   多治見   40.9    2007-08-16
山形県   山形  40.8    1933-07-25
山梨県   甲府  40.7    2013-08-10
和歌山県    かつらぎ    40.6    1994-08-08
静岡県   天竜  40.6    1994-08-04
山梨県   勝沼  40.5    2013-08-10
埼玉県   越谷  40.4    2007-08-16
群馬県   館林  40.3    2007-08-16

17. 1列目の文字列の異なり

1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはsort, uniqコマンドを用いよ.

file_list = open('hightemp.txt').readlines()
row1 = []
for f in file_list:
    row1.append(f.split('\t')[0])

print('\n'.join(list(set(row1))))
  • for文の中で1列目の文字列をrow1に入れていく
  • setで重複を削除したリストを出力

実行結果

$ python 17.py | sort
千葉県
和歌山県
埼玉県
大阪府
山形県
山梨県
岐阜県
愛媛県
愛知県
群馬県
静岡県
高知県

並び順をuniq sortコマンド実行の結果と合わせるためにsortしています。

uniq sortコマンドの実行結果

$ cut -f1 hightemp.txt | sort | uniq
千葉県
和歌山県
埼玉県
大阪府
山形県
山梨県
岐阜県
愛媛県
愛知県
群馬県
静岡県
高知県

参考

18. 各行を3コラム目の数値の降順にソート

各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).

file_list = open('hightemp.txt').readlines()
split_list = [ f.split('\t') for f in file_list ]
split_list.sort(key=lambda x:x[2], reverse=True)
for list in split_list:
    print('\t'.join(list), end='')
  • 3行目で3列目を逆順でソート
  • printでend=''を指定すると改行されない

実行結果

$ python 18.py
高知県   江川崎   41  2013-08-12
埼玉県   熊谷  40.9    2007-08-16
岐阜県   多治見   40.9    2007-08-16
山形県   山形  40.8    1933-07-25
山梨県   甲府  40.7    2013-08-10
和歌山県    かつらぎ    40.6    1994-08-08
静岡県   天竜  40.6    1994-08-04
山梨県   勝沼  40.5    2013-08-10
埼玉県   越谷  40.4    2007-08-16
群馬県   館林  40.3    2007-08-16
群馬県   上里見   40.3    1998-07-04
愛知県   愛西  40.3    1994-08-05
千葉県   牛久  40.2    2004-07-20
静岡県   佐久間   40.2    2001-07-24
愛媛県   宇和島   40.2    1927-07-22
山形県   酒田  40.1    1978-08-03
岐阜県   美濃  40  2007-08-16
群馬県   前橋  40  2001-07-24
千葉県   茂原  39.9    2013-08-11
埼玉県   鳩山  39.9    1997-07-05
大阪府   豊中  39.9    1994-08-08
山梨県   大月  39.9    1990-07-19
山形県   鶴岡  39.9    1978-08-03
愛知県   名古屋   39.9    1942-08-02

sortコマンドの実行結果

$ sort hightemp.txt -k3 -nr
高知県   江川崎   41  2013-08-12
岐阜県   多治見   40.9    2007-08-16
埼玉県   熊谷  40.9    2007-08-16
山形県   山形  40.8    1933-07-25
山梨県   甲府  40.7    2013-08-10
静岡県   天竜  40.6    1994-08-04
和歌山県    かつらぎ    40.6    1994-08-08
山梨県   勝沼  40.5    2013-08-10
埼玉県   越谷  40.4    2007-08-16
群馬県   館林  40.3    2007-08-16
群馬県   上里見   40.3    1998-07-04
愛知県   愛西  40.3    1994-08-05
静岡県   佐久間   40.2    2001-07-24
愛媛県   宇和島   40.2    1927-07-22
千葉県   牛久  40.2    2004-07-20
山形県   酒田  40.1    1978-08-03
群馬県   前橋  40  2001-07-24
岐阜県   美濃  40  2007-08-16
愛知県   名古屋   39.9    1942-08-02
山梨県   大月  39.9    1990-07-19
山形県   鶴岡  39.9    1978-08-03
大阪府   豊中  39.9    1994-08-08
埼玉県   鳩山  39.9    1997-07-05
千葉県   茂原  39.9    2013-08-11

参考

19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

file_list = open('hightemp.txt').readlines()
split_list = [ f.split('\t') for f in file_list ]
sort = {}
for s in split_list:
    if s[0] in sort:
        sort[s[0]] += 1
    else:
        sort[s[0]] = 1

for k, v in sorted(sort.items(), key=lambda x: -x[1]):
    print(str(v) + ' ' + str(k))

実行結果

$ python 19.py
3 埼玉県
3 山形県
3 山梨県
3 群馬県
2 岐阜県
2 静岡県
2 愛知県
2 千葉県
1 高知県
1 和歌山県
1 愛媛県
1 大阪府

cut sort uniqコマンドの実行結果

$ cut -f1 hightemp.txt | sort | uniq -c | sort -k1,1 -nr
      3 群馬県
      3 山梨県
      3 山形県
      3 埼玉県
      2 静岡県
      2 愛知県
      2 岐阜県
      2 千葉県
      1 高知県
      1 愛媛県
      1 大阪府
      1 和歌山県

参考


やっと2章が終わりました。
ソースをgithubにおきました。

github.com