schedule2018-07-12

01. 「パタトクカシーー」

はじめに

言語処理100本ノック 2015

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()はインデックスと要素を同時に取り出すことができます。

続いての記事

Python3で言語処理100本ノックまとめ

前の問題:00. 円周率

次の問題:02. 「パトカー」+「タクシー」=「パタトクカシーー」