背景
言語処理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を指定すれば文字列を逆順で切り出せる。