はじめに
Pythonを勉強するため、東京工業大学の岡崎教授が出題されている言語処理100本ノック 2015を解いていきます。
より深く理解するため、別解や利用したライブラリの解説もまとめていきます。
環境
Python3.6
OS : mac lint : pep8
問題
01. 「パタトクカシーー」
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.
解答1:str[::2]
word = "パタトクカシーー"
print(word[::2])
出力
パトカー
解説
00. 文字列の逆順でも触れましたが、コロンを挟んだ位置はそれぞれ[start:stop:step]
となっています。
3番目のstep
が正のとき、要素を間引きします。
word = "1234567890"
rev_word = word[::1]
>>> 1234567890
rev_word = word[::2]
>>> 13579
rev_word = word[::3]
>>> 1470
「1,3,5,7文字目」と奇数を得るため、一つ飛ばしのword[::2]
としました。
奇数番目の要素を取り出すことが出来ます。
偶数番目の要素を取り出す
word = "パタトクカシーー"
print(word[1::2])
>>> タクシー
偶数番目の要素を取り出す場合は、word[1::2]
とします。
start
は取り出す要素の先頭を指定します。プログラムの順序では先頭の番号は0から始まります。word[0]
はパ
、word[1]
はタ
となります。
別解1:for文
word = "パタトクカシーー"
for i in range(len(word)):
if not i % 2:
print(word[i], end='')
>>> パトカー
for文で解こうとした方も多いんじゃないでしょうか?
文字列の長さの回数ループして、奇数個目の文字を出力します。
if not i % 2:
をif i % 2:
とすると偶数となり、出力は「タクシー」になります。
print()
の引数end
は末尾に付く文字を指定できます。デフォルトでは改行文字¥n
が付いています。
print()
は複数の文字列を出力できます。
引数sep
は、出力する間の文字を指定します。
print('a', 'b') # デフォルトではsep=' '
>>> a b
print('a', 'b', sep=',')
>>> a,b
別解2:連想配列
word = "パタトクカシーー"
print("".join([word[i] for i in range(len(word)) if not i % 2]))
>>> パトカー
別解1:for文を連想配列に変換すると1行で書けます。 分かりづらいですね。。。
word = "パタトクカシーー"
print("".join([s for i, s in enumerate(word) if not i % 2]))
enumerate()
を使って短くしてみました。
enumerate()
はインデックスと要素を同時に取り出すことができます。
続いての記事
前の問題:00. 円周率
Python:ファイルダウンロードの進行状況とファイルサイズを表示する方法。urllib
Pythonschedule2024-02-27
【Python】tqdmでforの進捗状況を表示する
PythonColabolatoryschedule2021-02-16
学習済みの日本語単語ベクトルをColabolatoryで試してみる
自然言語処理PythonColabolatoryschedule2021-02-04
Unity ML-Agentsで新しく学習環境を作る
Unity機械学習C#PythonDeepLearningschedule2021-01-22
27. 内部リンクの除去
自然言語処理100本ノックPythonschedule2020-03-17