バリケンのPython日記 RSSフィード

2008-07-02

[] 文字列(3)  文字列(3) - バリケンのPython日記 を含むブックマーク はてなブックマーク -  文字列(3) - バリケンのPython日記  文字列(3) - バリケンのPython日記 のブックマークコメント

文字列(str型の値)は「シーケンス型」の一種だよ。シーケンス型は、添字表記 (インデクス表記) やスライス表記という表記を使ってデータの一部だけを参照することができるよ。

添字表記 (インデクス表記)

添字表記 (インデクス表記) は

文字列[インデクス]

という表記をするよ。インデクスは整数(int型)で指定してね。こうすると、元の文字列からインデクスで指定した位置の一文字を文字列(str型の値)として新たに生成するよ。ちなみに、Pythonでは1文字であっても「サイズが 1 の文字列」になるみたいだよ。

>>> a = 'Hello'
>>> a[0]
'H'
>>> a[1]
'e'
>>> 

インデクスは0から始まるから、気をつけてね。

あと、インデクスを負の数にすると、右から(文字列の後ろから)インデクスを数えるよ。

>>> s = "abcdefg"
>>> s[-1]
'g'
>>> s[-2]
'f'
>>>

スライス表記

「スライス表記」は、コロンで区切られた二つのインデクスで

文字列[開始位置:終了位置]

という表記をするよ。開始位置と終了位置は整数(int型)で指定してね。こうすると、元の文字列から開始位置と終了位置の間の部分文字列文字列(str型の値)として新たに生成するよ。

>>> a = 'Hello, world!'
>>> a[0:3]
'Hel'
>>> a[3:5]
'lo'
>>> 

スライス表記の最初のインデクスを省略すると0(文字列の先頭)、第2インデクスを省略すると文字列の最後を指定したことになるみたいだよ。

>>> a = 'Hello, world!'
>>> a[:4]
'Hell'
>>> a[7:]
'world!'
>>> 

さっきも出てきたけど、インデクスを負の数にすると、右から(文字列の後ろから)インデクスを数えるよ。

>>> s = "abcdefg"
>>> s[-2:]
'fg'
>>> s[:-2]
'abcde'
>>> 

文字列に対して破壊的操作はできない

Ruby文字列とは違って、Python文字列は一度生成したら変更できないみたいだよ。そういう意味では、Rubyの「シンボル」にちょっと似ているかも。

たとえば、'Hello'という文字列の一文字目に別の文字を代入しようとすると、

>>> a = 'Hello'
>>> a[0] = 'y'

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    a[0] = 'y'
TypeError: 'str' object does not support item assignment
>>> 

エラーになっちゃったね。そういうときは、新たに文字列を生成して元の変数に再代入すれば、期待した動作になるよ。

>>> a = 'Hello'
>>> a = 'y' + a[1:]
>>> a
'yello'
>>>

以前「図解「String#+」メソッドの動作」というエントリを書いたから、参考にしてね。Ruby同様、さっきの例だと再代入したあと元の文字列('Hello')はガーベージコレクションで自動的にメモリから削除されるよ。

インデクスを便利に使うための法則

インデクスを使うときは、次の法則を覚えておくと便利だよ。まずはインデクスは「文字と文字のあいだ」を指している、ということだよ。次の表を丸暗記しちゃおう。

  +---+---+---+---+---+ 
  | a | b | c | d | e |
  +---+---+---+---+---+ 
  0   1   2   3   4   5 
 -5  -4  -3  -2  -1

この法則を使えば、"abcde"という5文字の文字列のうち、bからdが欲しいなら[1:4]または[-4:-1]と指定すれば良い、という感じだよ。

>>> s = "abcde"
>>> s[1:4]
'bcd'
>>> s[-4:-1]
'bcd'
>>> 

もうひとつの覚えておくと便利なのが、s[:i] + s[i:]がsに等しくなる(iは任意の整数)、という法則だよ。

>>> s = "abcdefg"
>>> s[:3] + s[3:]
'abcdefg'
>>> s[:4] + s[4:]
'abcdefg'
>>>

この法則は、「文字列の途中に別の文字列を埋め込んだ文字列」を新たに生成したいときに使うと便利だよ。

>>> s = "abcdefg"
>>> s[:3] + ' ' + s[3:]
'abc defg'
>>> s[:4] + ' ' + s[4:]
'abcd efg'
>>> 
トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20080702