LoginSignup
1
0

More than 3 years have passed since last update.

Pythonひよっこが『言語処理100本ノック 2020』に挑戦【06-09】

Posted at

Pythonひよっこのわたしが、『言語処理100本ノック 2020』の第1章の後半部分に挑戦してみました。
一般の方が公開されている解答と比べながら、1問ずつ学んだことなどをまとめていきたいと思います。

こちらの続きになります。
Pythonひよっこが『言語処理100本ノック 2020』に挑戦【00-05】

第1章:準備運動(後半)

06.集合

#06.
##05.で作ったn-gramの関数
def n_gram(text,n):
    text_len=len(text)
    result=[]

    for i in range(text_len-n+1):
        result.append(text[i:i+n])

    return result


text1="paraparaparadise"
text2="paragraph"

X=set(n_gram(text1,2))
Y=set(n_gram(text2,2))

##和集合
print(X.union(Y))
##積集合
print(X.intersection(Y))
##差集合
print(X.difference(Y))
##'se'がXとYの和集合に入っているか
print("se" in X.union(Y))

union()やintersection()がセット型のみで使えるものだということを失念していたので、はじめはエラーが出てしまいました(><)
ネットで list型→set型 の方法を調べたらすぐに実装できました。

07.テンプレートによる文生成

#07.
def make_sentence(x,y,z):
    return "{}時の{}は{}".format(x,y,z)


x=12
y="気温"
z=22.4
print(make_sentence(x,y,z))

文字列メソッド format() を学びました。
型を指定せずに埋められるなんて便利です...

08.暗号文

#08.
def cipher(text):
    result=""

    for i in text:
        ##英小文字のとき
        if 97<=ord(i)<=122:
            result=result+chr(219-ord(i))
        ##それ以外のとき
        else:
            result=result+i

    return result


text="I'm 22 years old."
print(cipher(text))

似たようなコードをC言語でも書いたことあるな〜って思ったので、あまり悩まずに書くことができましたが、ord()関数やchr()関数を知らなかったのでそこに時間がかかってしまいました。
ほかの方の解答で、関数cipherを3行で書いているものがあってびっくりしました...わたしのコード長いですね....

09.Typoglycemia

#09.
import random

text="I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
text_split=text.split(' ')
result=""
tmp=""

for x in text_split:
    x_len=len(x)

    ##単語の長さが5以上のとき
    if x_len>4:
        ###1文字目
        tmp=tmp+x[0]
        ###2文字目-
        y=x[1:x_len-1]
        tmp=tmp+"".join(random.sample(y,x_len-2))
        ##最後の文字
        tmp=tmp+x[x_len-1]

        result=result+tmp
        tmp=""

    ##単語の長さが4以下のとき
    else:
        result=result+x

    if x!=".":
        result=result+" "

print(result)

タイポグリセミア現象です。昔(?)2ちゃんのスレで見かけた気がします、懐かしいです。
いちいち変数tmpに入れなくても実装できますね...回りくどいコードになってしまいました。
ほかの方のスマートなコードは
『個々のパーツを作ってから、最後に(return文などで)合体させる』
という構造ですが、わたしのコードは
『先頭からひとつずつパーツを作り、何か(変数tmpや変数result)に積み上げていく』
という構造になっています。
おかげで、わたしのコードはとても冗長なコードになってしまっています....
あと、リストの引数に負の数を入れるのをもっと積極的にやっていきたいです。

第1章のまとめ(と反省)

第1章はシンプルな構造の問題が多く、(細かい文法や関数を除けば)とくに悩むことなく手を動かすことができたと思います。
ただ、ほかの方のコードと比べてわたしのコードの冗長さが目立っていたので、そのあたりを気にしてコードを書けるようになりたいなぁって思いました。
そのあたりを意識してこれからも練習を続けます!!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0