情報学部大学生のダラダラ日記

β日記

機械学習や日記っぽいものを書きます

言語処理100本ノック2020 第2章 Pythonでの解答例

スポンサーリンク

第1章↓↓

parco1021.hatenablog.com

第2章:UNIXコマンド

UNIXコマンドとありますが、筆者は現在WindowsにしかPythonの実行環境をそろえておらず、Linuxもさっぱり使っていないのでコマンドは省略します。他の方がやった解答を見て自分のプログラムの出力が正しいことは確認します。※

 

10.行数のカウント(11日目|8月15日)

行数をカウントせよ.確認にはwcコマンドを用いよ.

テキストファイルをpythonで読み込む方法は何通りかありますが、今回は最も(?)ポピュラーなpandasを使います。pandasで読み込み表示するだけで行数*列数も表示されるのですが、shapeを使ってそれぞれ表示してみます。行数だけでなく、ついでに列数を表示させてみました。

 

11.タブをスペースに変換(12日目|8月16日)

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

区切り文字をタブにして読み込んだtxtファイルを区切り文字を半角スペースにして保存します。この時、headerとindexをFalseにしておかないとインデックス番号等がついたまま保存されてしまうので注意が必要です。

元のファイルと出力されたファイルの一部

Get-Content data.txt -last 5
Benjamin M 13381 2018
Elijah M 12886 2018
Lucas M 12585 2018
Mason M 12435 2018
Logan M 12352 2018 Get-Content newdata.txt -last 5
Benjamin M 13381 2018
Elijah M 12886 2018
Lucas M 12585 2018
Mason M 12435 2018
Logan M 12352 2018

全体↓↓

github.com

12.1列目をcol1.txtに、2列目をcol2.txtに保存(13日目|8月17日)

各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

 df[0]に1列目がdf[1]に2列目が格納されているのでそれを保存します。

 

結果

github.com

 

13.col1.txtとcol2.txtをマージ(14日目|8月18日)

12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

pandasのconcat()関数を使います。デフォルトだと縦方向にマージしてしまうので、axis=1とすることで横方向にマージするよう指定します。

出力ファイルは上記のgithubにあります。

 

14.先頭からN行を出力(15日目|8月19日)

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

コマンドライン引数はsys.argvで受け取ります。ここで注意すべきは第一引数がargv[0]ではなくargv[1]に格納されていることです。受け取ったnはstr型なのでint型に変換し、pandasの関数head()に渡します。


15.末尾のN行を出力(16日目|8月20日)

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

 14と同様です。異なる点はhead()ではなく、tail()を使います。

 

16.ファイルをN分割する(17日目|8月21日)

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

演算子'//'は除算の結果を切り捨てます。例えば10//3ならば3となります。

 

17.1列目の文字列の異なり(18日目|8月22日)

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

duplicated().value_counts()は重複する場合にTrueとします。なのでFalseの数が重複しない要素の数です。例えばAnna,Bnna,Cnna,Annaだった場合、False,False,False,Trueとなります。重複しない要素を取り出すにはunique()メソッドを使います。その要素数を数えるにはlen(df.unique())でもいいのですが、nunique()によっても得られます。

 

 

18.各行を3コラム目の数値の降順にソート(19日目|8月23日)

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

sort_values()を用います。引数にソートしたい対象のコラムを指定します。今回は3カラム目なので2を指定しました。出力は先頭の5行のみとしています。

 

19.各行の1コラム目の文字列の出現頻度を求め、出現頻度の高い順に並べる(20日目|8月24日)

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

 value_counts()メソッドを用います。value_counts()は出現回数のカウントだけでなく、デフォルトで降順にソートしてくれるため題意の出力をすることができます。ソートをしたくない場合はvalue_counts(sort=False)とし、昇順にしたい場合はvalue_counts(ascending=True)とします。

これで第2章は終わりです。

 

第3章↓↓

parco1021.hatenablog.com

スポンサーリンク