はじめに
タイトルにある通り「言語処理100本ノック 2015」の問題を解きながらPythonを学ぶことが目的です。
なので、ただ問題を解いて終りにならないよう、理解に至るまでの過程、リファクタリングの過程、異なるアプローチからの解き方があるケースでは複数の回答を、また、関連する内容についても言及していこうと思います。
100問やり遂げた暁には、自分はパイソニスタ?パイソニスト?パイソニアン?だと胸を張って言えることを目標に。(なぜ通り名がこんなにたくさん・・・?)
環境
- Python 3.7.2
- Win10
01. 「パタトクカシーー」
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ..
【作成したコード】
>>> word = "パタトクカシーー"
>>> print(word[::2])
パトカー
前回スライスの動きをしっかり理解しておいたおかげで、今回はスムーズに解けました。
2,4,6,8文字目を出力する場合は下記。
>>> word = "パタトクカシーー"
>>> print(word[1::2])
タクシー
js、Rubyとの比較
参考までに、JavaScriptとRubyでも試してみました。
【JavaScript】
const word = 'パタトクカシーー';
const policeCar = [...word].filter((v, i) => !(i&1)).join('');
console.log(policeCar); // => パトカー
【Ruby】
word = "パタトクカシーー"
police_car = word.split("").select.with_index{|v, i| (i&1 === 0)}.join("")
puts police_car # => パトカー
少なくとも僕の調べた範囲では、js、rubyとも、それ単体で文字の位置を指定して出力するメソッドを見つけることが出来なかったため、どちらも、以下の手順を踏みました。
- いったん文字列⇒配列に変換
- 配列のインデックス値が偶数である要素を抽出
- 抽出した要素をつなげて文字列として返す
もう少し良いやり方がありそうな気もしますが、Pythonの勉強が主たる目的なので、そこは、あまり深追いせずに。
js、rubyともにstringオブジェクトで使えるslece()メソッドが用意されており、どちらも「〇文字目~〇文字目」という範囲の指定はできるのですが、今回のようなケースだと、stepが指定できるPythonのスライスは非常に便利ですね。
とはいえ、実務において一文字置きに抽出が必要なケースというのが、ちょっと思い浮かびませんが・・・
今回の問題は以上になります。
誤りや、もっと簡潔な書き方がある、等々、ご意見がありましたら、ご指摘頂ければ幸いです。