読者です 読者をやめる 読者になる 読者になる

言語処理100本ノック 00-02

www.cl.ecei.tohoku.ac.jp
以前に見つけてから久しく手を付けていなかったのだけれど,暇ができたのでやってみる.

目標

  1. なるべくコードを綺麗に,なるべくコード長を短く(≠短いは正義)
  2. 分からないことを調べたらoutput(ここをメモ代わりとするわけだけれど)を忘れずに
  3. がんばって続ける

第1章: 準備運動

00. 文字列の逆順

文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

解答

print('stressed'[::-1])

リストのスライスで一発.パッと思いつかず少し考え込んだあたりひどい.
  

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

「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

解答

s = 'パタトクカシーー'
t = ""
for i in range(len(t)//2):
	t += s[2*i]
print(t)

for文はべんりだなとおもいます

range(len(t)//2)

が絶妙にダサいし,空文字列とか空リストを用意する方法は  
直感的ではあるのだけれど,メモリに悪いし綺麗じゃない?よね.
  

スライス最高

s[::-1]をならったのなら

>>> s=u'パタトクカシーー'
>>> print(s[::2])
パトカー

としないと。
Python で言語処理100本ノック2015 - Qiita

スライス使うって発想がパッと出てこない.for文脳を少しずつ変えないとね.  

02. 「パトカー」+「タクシー」=「パタトクカシーー」

「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

解答

a = 'パトカー'
b = 'タクシー'
c = ''
for s,t in zip(a,b):
	c += s+t
print(c)

こちらも空文字列.zip()がすんなり使えたので及第点としたい.
  

文字列結合はjoin()を使う

print ''.join([char1 + char2 for char1, char2 in zip(s1, s2)])

回答されていたs3 = s3 + ...というように文字列をつなげていくと、
毎回新しいメモリを確保しないといけないので遅いです。
なので文字列のリストを作ってから、最後にjoinしてつなげます。
Pythonに限らず多くの言語で同じ問題があります。
Python で言語処理100本ノック2015 - Qiita

つい最近ランレングス圧縮の問題(ABC)でjoin()の使い方を知ったところで,  
まだあまりうまく使いこなせていないのだけれど,とても重要そう.
ランレングス圧縮についてはまた別でエントリ書きたい.

たぶんこんなのが続きます

最後になりましたが.Pythonに限らず,ぼちぼちいろいろ書くつもり.