2018年02月04日

言語処理100本ノックでPython入門 #09 - リスト操作、文字列操作など

  
本日は、言語処理100本ノック 2015の問題09です。

これが第1章の最後の問題です。

■ 問題

09. Typoglycemia

スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .")を与え,その実行結果を確認せよ.

■ 書いたコード
import random

def Typoglycemia(word):
    length = len(word)
    if length < 5:
        return word
    s = word[0]
    e = word[-1:]
    m = list(word[1:-1])
    random.shuffle(m)
    return s + "".join(m) + e

def main():
    text = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
    words = text.split(' ')
    result = []
    for word in words:
        result.append(Typoglycemia(word))
    print(" ".join(result))

if __name__ == '__main__':
    main()

単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替える関数Typoglycemiaを定義しました。ただし,長さが4以下の単語は並び替えないように制御しています。

これができれば、main関数で、文を空白文字で区切り、Typoglycemia関数を呼び出して得られた単語を連結させればOK.


■ 結果
I c'oulndt bevleie that I colud alactluy utdnrnsead what I was rneaidg : the peeaohnnml poewr of the hmaun mind .

Typoglycemia とは、最初と最後の文字が合っていれば、途中の文字を並べ替えても、読めてしまう現象のことを言うらしいです。昔、ひらがなで同様のプログラムを書きました。


■ 今回のトピック(文字列操作)

文字列の最後の文字
word[-1:]

文字列の先頭と最後を除いた文字列
word[1:-1]

文字列の長さ
len(word)

文字列を空白文字で分割
line.split(' ')

複数の文字列を連結(間にカンマ)
",".join(words)


■ 今回のトピック(リスト操作)


文字列を文字リストに変換
list(word)

文字リストを文字列へ
"".join(chars)                

リストのシャッフル
import random

random.shuffle([0, 1, 2, 3, 4, 5])

リストの連結
result = []
for word in words:
    result.append(word)


■ 今回のトピック(その他)


モジュール名 __main__

以下のように書くと、そのモジュールが直接実行された場合にのみ、main()が呼び出されます。 モジュールが直接実行された場合にのみ、__name__ というシステム変数に '__main__'というモジュール名が設定されます。
if __name__ == '__main__':
    main()        


これで、「第1章: 準備運動」のすべての問題を解くことができました。

変数、条件分岐、繰り返し、文字列、辞書、集合、リスト、リスト内包表記、関数など、結構いろんなことを学べました。