言語処理100本ノック(第二章後半)



スポンサードリンク

第2章前半の続きです。

第2章UNIXコマンドの基礎

15. 末尾のN行を出力

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

 

ここまでの知識でできる問題です。特に難しくないです。コマンドライン引数で指定した、数字をhogeとして受け取りそれを使うだけです。

実行結果(コマンドライン引数に6を入力した場合):

 

UNIXコマンドでの確認:

数字の前に- をつけましょう。

 

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

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

コマンドライン引数を用いない場合:

input関数は、コマンドラインで入力したデータを文字列として扱うものです。そして入力した文字列をしようし、プログラム内で用いることができます。

math.ceil()は切り上げです。4/3でしたら、1.3333 となり四捨五入なら1となりますが、切り上げなので2になります。

コマンドライン引数を用いる場合:

ファイル分割数を2番目のコマンドライン引数で入力した場合のやり方です。

分割の入力方法が異なるので、unitの指定の仕方が少し異なるだけです。これまでの知識のみで書けます。

実行結果(分割数が4の場合):

上を実行すると、child_0*のファイルが作成されます。ここでは4分割されたファイルのうち一つのファイルの中身を示します。

unitで計算している通り、行数が (hightemp.txtの行数/分割数)になっていれば良いはずです。

24/4=6なので成功です。

UNIXコマンドでの確認:

out.*でファイルが作成されます。

注意しなければならないのは、ここでの4は分割数ではなくsplitの数(何行ごとに分割するかの数)なので、24/4=6となり、ファイルが6つ作成されるはずです。

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

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

最初まず問題の意味を理解するのに苦労しました笑。要するに24つのデータのうち、何県のデータかということです。県がダブっているデータもあるので、そういうのをダブりでカウントしないようにするにはどうすれば良いかということです。

set()コマンドで一発。そうすることで、list型のデータが集合型 に置き替わります。

データを集合として扱う場合,このsetコマンドはかなり重宝されます。

実行結果:

相変わらず和歌山県のところだけおかしいですが、hightemp.txtの問題なので、無視します笑

UNIXコマンドでの確認:

uniqは連続して重複している行を一つにまとまるコマンドで、sortは辞書順に並び替えてくれるものです。

離れたデータの重複を一つにまとめる時は両方を組み合わせます。二つのコマンドを組み合すことで、かなり便利なものになりますね。



スポンサードリンク

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

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

温度の高い順にデータを並び替えろということです。

無名関数(lambda)を使っています。

無名関数は「その場限りの関数」で自在に使えればかなり柔軟なプログラムがかけます。

オーダーメイドのスーツを作っても、自分以外の人にとっては無意味なイメージです。ただし、自分にとってはちょーぜつ大事ですよね。

sorted()でデータを並び替えますが、その並び替え方をlambdaを使って指定しています。

数学チックに説明すると、xは変数です。このxにいろんな値が入ります。今なら各行のデータです。1行目も、2行目も、3行目もこの.split()[2]を使います、という意味です。

.split()[2]はこれまでの知識で理解できますね。分割したデータ集合のうち3番目のデータ(list型は0から始まります。)、すなわち温度のデータに注目してデータを sort(並び替えましょう)という意味です。

最後に「数値の逆順」と言っているので、reverse=Trueと書きます。

実行結果:

温度の高い順になっているのがわかります。

 

UNIXコマンドでの確認:

pythonプログラムと実行結果が異なると思います。

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

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

listデータの出現回数を求めるのはcollectionsライブラリのCounter()コマンドで数えることが可能です。

単語と単語の出現回数を表示させるにはcounterに格納されているデータを用いるのですが、その際に.most_common()という引数を用います。決まり文句として覚えて構わないでしょう。

出力するのは単語(県名)とその出現数なので、for文の変数を二つ指定します。

実行結果:

 

UNIXコマンドでの確認:

uniq -c で重複行をカウントしてくれるみたいです。

| sort -r なしで実行すると、カウントはしてくれますが、出現回数の多い順に並び替えされないので、いります。

最初のsortはあくまでuniqで重複行をカウントするためのものです。(uniqは縦に連続したデータの重複を数えるから。県名が同じでも離れたデータであれば、別に別にカウントしてしまいます。)

 

以上で2章は終了です。続きはこちら→3章前半!



スポンサードリンク

記事が役に立ったらシェア!

投稿者:

中村 俊

中村 俊

1993/09/04生まれ。機械系大学院を休学し、ベンチャーでインターンしている最中。直近では、デカルトの「方法序説」に感銘を受けた。 趣味:読書、web開発の勉強、異分野の論文読んだり、記事書いたり。 最終的には経営者か研究者になりたい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA