How to make datas our friends

「エンジニアは発信していくことが責務である」という言葉に感化されて始めた勉強したことを書き留めていく備忘録的なやつ。

Pythonで文字列を逆順にする

背景

言語処理100本ノック 2015を今やっているのでその備忘録的なやつ。

やりたいこと

Pythonで文字列"stressed"を逆順で表示する。
(つまり"desserts"になれば成功)

結果

以下の方法で文字列を逆順にできました。

> str = 'stressed'
> str[::-1]
> 'desserts'

解説/考察

2.3.6 Sequence Types -- str, unicode, list, tuple, buffer, xrangeを参考にしました。
sequence type の s は s[i:j:k] を使用して文字列をスライスできるらしい。

s[i] = i'th item of s, origin 0
s[i:j] = slice of s from i to j
s[i:j:k] = slice of s from i to j with step k

日本語に翻訳するとこんな感じでしょうか。
(日本語のリファレンスもどこかにあるのでしょうか?w)

s[i] = 文字列sから0を起点にしてi番目文字を切り出す
s[i:j] = i番目からj番目の文字列を文字列sから切り出す
s[i:j:k] = i番目からj番目の文字列を文字列sからk個おきに切り出す

まず s[i] の動作について一通り試してみました。

> str = 'stressed'
> # 0が起点なので0を指定すると1番目の文字"s"が切り出される
> str[0]
> 's'
> # 同様に0が起点なので1を指定すると2番目の文字"t"が切り出される
> str[1]
> 't'
> # マイナス値を指定すると文字列のけつからi番目の文字を切り出せるっぽい
> str[-1]
> 'd'
> # 文字列の文字数より大きい値は指定できない
> str[9]
> IndexError: string index out of range

続いて s[i:j] も一通りいじってみる。

> # 何も指定しないと全て切り出される
> str[:]
> 'stressed'
> # 0起点に6文字分切り出す
> str[0:6]
> 'stress'
> # 0起点なので2文字目から6文字分切り出す
> str[1:6]
> 'tress'
> # s[i]と違い文字数より大きい値を指定しても怒られない(ただし何も出ない)
> str[10:10]
> ''
> # jを指定しないでiにマイナス値を指定するとけつからi番目までの文字が切り出される
> str[-4:]
> 'ssed'
> # iが文字列の文字数より大きくてもけつで止まる
> str[-9:]
> 'stressed'

最後に s[i:j:k] です。

> # 何も指定しないと全て切り出される
> str[::]
> 'stressed'
> # 1文字づつ切り出す
> str[::1]
> 'stressed'
> # 2文字づつ切り出す
> str[::2]
> 'srse'
> # -1文字づつ切り出す(けつまで繰り返す)
> str[::-1]
> 'desserts'
> # -2文字づつ切り出す(けつまで繰り返す)
> str[::-2]
> 'dset'

以上のことから str[i:j:k] の k に-1を指定すれば文字列を逆順で切り出せる。