Python で文字列反転
文字列を反転させる方法として、例えば Java ならば StringBuffer クラスの reverse メソッドがあるが、Python で「いかにも Python っぽい !」という書き方があったので紹介しつつ考察したい。
まずは正解から言ってしまうと、ここに書いてある。
文字列を逆順にする - ひきメモ
>>> str = "abcdefg" >>> str[::-1] 'gfedcba'
ではなぜこれが正解なのか。以下考察。
Python のドキュメントによれば、sequence type の s に対する s[i:j:k] は
slice of s from i to j with step k
とある。つまり i + k, i + 2k, … と取り出して、j に達したところで止まる。ただし注意書きとして
The slice of s from i to j with step k is defined as the sequence of items with index x = i + n*k such that 0 <= n < (j-i)/k. In other words, the indices are i, i+k, i+2*k, i+3*k and so on, stopping when j is reached (but never including j). If i or j is greater than len(s), use len(s). If i or j are omitted or None, they become “end” values (which end depends on the sign of k).
とある。
>>> str[:4:2] 'ac' >>> str[2::2] 'ceg'
第一のケースでは 0 ≤ n < (4 - 'end')/2 から 'end' = 0 と推定され、第二のケースでは 0 ≤ n < ('end' - 2)/2 から 'end' = len(str) と推定されるのがおわかりだろう。
>>> str[:2:-2] 'ge' >>> str[4::-2] 'eca'
第一のケースでは 0 ≤ n < (2 - 'end')/(- 2) から 'end' = len(str) - 1 と推定される。第二のケースでは 0 ≤ n < ('end' - 4)/(- 2) から 'end' = - 1 と推定される(ただし str[4:-1:-2] は意味が変わってしまうので注意)。
ここまで試したところで改めて
str[::-1]
という式を眺めれば、これは「文字列の末尾から 1 個ずつさかのぼって先頭まで要素を取りだす」という操作になるので、文字列を反転させる操作になることがお分かりいただけると思う。