Hatena::ブログ(Diary)

似非プログラマの覚え書き RSSフィード Twitter

2011-11-04 今更ですが

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 個ずつさかのぼって先頭まで要素を取りだす」という操作になるので、文字列を反転させる操作になることがお分かりいただけると思う。

redcat_progredcat_prog 2011/12/16 19:41 補足。日本語文字列の場合、これは正しい挙動にならない。日本語の場合は Unicode 文字列にする必要がある。

redcat_progredcat_prog 2011/12/16 20:23 さらに補足。Python 3.x 系では文字コードのデフォルトは Unicode に変更されているので、上記の補足は Python 2.x 系の場合だけ気を付けること。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/redcat_prog/20111104/1320395840
Connection: close