はじめに
Pythonを勉強するため、東京工業大学の岡崎教授が出題されている言語処理100本ノック 2015を解いていきます。
より深く理解するため、別解や利用したライブラリの解説もまとめていきます。
環境
Python3.6
OS : mac
問題
03. 円周率
"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.
解答
import re
sentensce = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'
# ,.スペースで分ける
words = re.split(r'[,.]? ?', sentensce)
# 空文字を削除
words = list(filter(lambda w: w != '', words))
print(words)
# => ['Now', 'I', 'need', 'a', 'drink', 'alcoholic', 'of', 'course', 'after', 'the', 'heavy', 'lectures', 'involving', 'quantum', 'mechanics']
# 単語の長さに変換
words_len = list(map(len, words))
print(words_len)
出力
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
解説
str.split()
で分けてから、カンマとピリオドを除いてもできます。
今回は、正規表現を使って一度に分けてみました。
import re
は正規表現を使うためのライブラリです。
re.split(pattern, string)
を使って文を単語に分けています。文には (半角スペース)
と,
と.
があり、これらを目安に単語に分けていきます。
正規表現はr'[,.]? ?'
としました。?
は0回以上の繰り返しです。言葉にすると、「,または.の0回以上の繰り返しと半角スペースの0回以上の繰り返し」で分けています。
末尾の"mechanics."で空文字ができるため、filter()
を使って除外しました。
最後に、list(map(len, words))
で、各単語の長さのリストに変換しています。
最後に
出力してから気づいたのですが、単語長の並びが円周率になっていました!
タイトルの円周率が答えあわせにもなるなんて、素敵な問題ですね。
合っているか、確認します。
import math
print(math.pi)
# => 3.141592653589793
ちなみに、円周率の記憶方法としてこの文章は有名なようだ。
英語
- Yes, I know a number. = 3.1416
- How I wish I could enumerate PI easily ... = 3.1415926
- How I want a drink, alcoholic of course, after the heavy lectures involving quantum mechanics! = 3.14159265358979
wiki
日本だと語呂合わせですが、欧米では各単語の文字数で覚えるみたいですね。
続いての記事
前の問題:02. 「パトカー」+「タクシー」=「パタトクカシーー」」
次の問題:04. 元素記号