文字列・配列・連想配列

文字列

Python で文字列を作成する場合にはシングルクォート、ダブルクォート、または三連クォートで文字列をくくる。
三連クォートの文字列は、改行を含むことが出来る。三連クォートに使うのはシングルクォートでもダブルクォートでもかまわないが当然対になっている必要がある。

print 'single quat'
print "double quat"
print """triple
quat"""
single quat
double quat
triple
quat

※補足 Python の print は末尾に改行を付与する。改行したくない場合は文字列の後にカンマをつける。

print 'text 1'
print 'text 2\n'
print 'text 3',
print 'text 4'
text 1
text 2

text 3 text 4

Perl とは違ってシングルクォートとダブルクォートに違いは無く、シングルクォート中でも半角 \ によるエスケープは有効*1
Perl のシングルクォートの文字列に相当する(エスケープを無視する)ものとして、半角 r を文字列に付与する方法がある。
この方法はシングルクォート、ダブルクォート、そして三連クォートでも有効である。

print 'single\tquat'
print "double\tquat"
print """triple\tdouble
quat"""
print r'single\tquat'
print r"double\tquat"
print r"""triple\tdouble
quat"""
single	quat
double	quat
triple	double
quat
single\tquat
double\tquat
triple\tdouble
quat

Python で C の printf 相当のことをする場合には、文字列フォーマットを使用する。
利用できる書式変換は C とだいたい同じである*2
文字列フォーマットの構文は printf とは異なる。以下の C のコードと Python のコードが同じ文字列を出力する。

printf("%d %u %.1f %s\n", 1, 2, 3, "ダー");
print "%d %u %.1f %s"%(1, 2, 3, "ダー")

Python の文字列は、加算と乗算が可能*3。加算は文字列の連結、乗算は文字列を繰り返して連結する。

配列

Python で配列と呼べそうなものにはリストとタプルの2つがある。
リストは1次元の可変長配列として扱える。しかし、自動的に拡張はしない。
リストを作成するときは、要素をカンマで区切り[]でくくる。
それぞれの要素に型はなく、リストの要素としてリストを含むことも出来る。

a=[0, 'a', [1, 'b']]
print a[0]
print a[1]
print a[2]
print a[2][0]
print a[2][1]
0
a
[1, 'b']
1
b

タプルもリストとだいたい同じだが、要素が変更できない。タプルは要素をカンマで区切り()でくくる。

a=[0, 'a', [1, 'b']]
a[1]='b'   # OK
t=(0, 'a', [1, 'b'])
b[1]='b'   # エラー
b[2][0]=0  # これは OK

リスト、タプルの要素数を知るためには組み込み関数 len を使用する。

>>> a=[0, 'a', [1, 'b']]
>>> print len(a)
3

リスト、タプルの添え字は 0 から始まる。また、負の数も利用できる。
負の数を指定した場合、末尾から数えてアクセスできる。-1 を指定すると一番最後の要素にアクセスできる。

>>> a[0, 'a', [1, 'b']]
>>> print a[-1]
[1, 'b']

リスト、タプルの一部を取り出すために、スライスが利用できる。
スライスの構文は、リスト、タプルの添え字の部分にコロンで区切った二つの値を指定する形になる。
コロンの前の数字はスライスに含まれる範囲の先頭インデックスである。
コロンの後ろの数字はスライスに含まれる範囲の最後の要素の次のインデックスである。

>>> a=[0, 1, 2, 3, 4]
>>> a[1:4]
[1, 2, 3]
>>> a[-1:-4]
[]
>>> a[-4:-1]
[1, 2, 3]

二つの値はそれぞれ省略可能で、前の値を省略すると 0 として扱われ、
後ろの値を省略すると指定の位置より後ろ全てがスライスの範囲に含まれる。

>>> a[:3]
[0, 1, 2]
>>> a[3:]
[3, 4]
>>> a[-1:]
[4]
>>> a[:-1]
[0, 1, 2, 3]
>>> a[:]
[0, 1, 2, 3, 4]

スライスでは、リストからは新たなリスト、タプルからは新たなタプルが得られる。
それぞれはもとの配列のある範囲を要素とした新たなオブジェクトになる。
つまりリストからスライスされた新たなリストを変更しても元のリストは影響を受けない。


文字列もリストと同じような要素アクセスができる。
たとえば以下のようにして部分文字列を作ることが出来る

>>> s="test string"
>>> print s[-5:]
tring

連想配列

Python には Perl連想配列に似た辞書がある。
辞書は、文字列など*4を添え字とした配列のようなものである。
辞書の添え字をキーと呼ぶ。辞書を作成するときには、キーと値をコロンで対応付けた要素を
カンマで区切ってならべて{}でくくる。
辞書は代入操作では自動的に拡張されるが、値を参照するだけの場合は自動的に拡張されない。

d={'one':1, 'two':2, 'three':3}
print d['one']     # 1 が表示される
d['four']=4        # キー'four'とそれに対応する値 4 が辞書に追加される
print d['five']    # エラー

辞書にあるキーが存在するかどうかを調べたい場合には、関数 has_key が利用できる。

>>> d={'one':1, 'two':2, 'three':3}
>>> d.has_key('one')
True
>>> d.has_key('four')
False

また、関数 keys, values, items でそれぞれ辞書に含まれるキーのリスト、値のリスト、
キーと値の対を含むタプルのリストが得られる。

>>> d={'one':1, 'two':2, 'three':3}
>>> d.keys()
['three', 'two', 'one']
>>> d.values()
[3, 2, 1]
>>> d.items()
[('three', 3), ('two', 2), ('one', 1)]

*1:また C/C++ とは異なり 'a' は「 a という文字」ではなく「a」一文字の文字列である。

*2:筆者が今までに C と同じ感覚で使用して困ったことがない程度には同じです

*3:加算に見える書き方と乗算に見える書き方が可能というほうがより正確

*4:ハッシュ可能なオブジェクト。タプルも使えるみたいです。