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

2008-07-04

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

リストは文字列とは違って、要素の変更が可能だよ。

>>> a = ['hoge', 'fuga', 1, 2]
>>> a[2] = a[2] + 3
>>> a
['hoge', 'fuga', 4, 2]
>>> a[3] += 3
>>> a
['hoge', 'fuga', 4, 5]
>>>

余談だけど、Ruby同様、Pythonでも「a = a + 1」のような表現を「a += 1」のように書けるんだね。

リストの一部分(部分リスト)対して、それと同じ大きさのリストを代入することで、一気に要素を変更することもできるよ。

>>> a = ['hoge', 'fuga', 1, 2]
>>> a[0:2] = [3, 4]
>>> a
[3, 4, 1, 2]
>>>

空のリストを代入すると、項目の除去が行えるよ。

>>> a = ['hoge', 'fuga', 1, 2]
>>> a[0:2] = []
>>> a
[1, 2]
>>>

リストのある位置に要素を追加したいときは、追加したい位置を[n:n]で指定して代入すればいいみたい。

>>> a = ['hoge', 'fuga', 1, 2]
>>> a[1:1] = ['foo', 'bar']
>>> a
['hoge', 'foo', 'bar', 'fuga', 1, 2]
>>>

リストの先頭に要素を追加したいときは[:0]と指定して代入すればいいよ。

>>> a = ['hoge', 'fuga', 1, 2]
>>> a[:0] = [3, 4]
>>> a
[3, 4, 'hoge', 'fuga', 1, 2]
>>>

文字列同様、リストの要素数を数えるには組み込み関数len()を使うよ。

>>> a = ['hoge', 'fuga', 1, 2]
>>> len(a)
4
>>>

リストは入れ子に出来るよ。つまり、リストの要素にリストを入れることが出来るよ。

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> p
[1, [2, 3], 4]
>>>

リストの要素の中にリストがある場合、そのリストの中にいくつ要素があっても、ひとつの要素と数えられるよ。

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> p
[1, [2, 3], 4]
>>> len(p)
3
>>>

リストの入れ子を参照するには、添字表記(インデクス表記)を多重に書くよ。

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> p
[1, [2, 3], 4]
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>>

append()メソッドを使うと、リストの最後に要素を追加できるよ。

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> p[1].append('hoge')
>>> p
[1, [2, 3, 'hoge'], 4]
>>> q
[2, 3, 'hoge']
>>>

あれ?変数pの2番目の要素(リスト)に'hoge'という要素を追加したはずなのに、変数qのリストにも'hoge'という要素が追加されているね。

これは、p[1]もqも同じオブジェクト(リストオブジェクト)を参照していて、しかもappend()メソッドが「破壊的メソッド」だからだよ。

「破壊的メソッド」については、以前「Rubyの「破壊的メソッド」」というエントリを書いたから、参考にしてね。あと余談だけど、Rubyでは文字列に対して破壊的メソッドがあったけど、Python文字列は破壊的操作ができないみたいだよ。

Rubyもそうだけど、Pythonの「変数」や「リストの要素」は、「値を入れておく箱」じゃなくって「値を参照するためのポインタ」だよ。だから、参照先のオブジェクトが「破壊」されると、他の参照方法で参照してもやっぱり「破壊」されているんだよ。

ためしに、変数qに対してappend()メソッドを使ってみるよ。結果は次の通り、さっきと同じになるよ

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> q.append('hoge')
>>> p
[1, [2, 3, 'hoge'], 4]
>>> q
[2, 3, 'hoge']
>>>

以前「Rubyの「変数」再考」というエントリを書いたから、そちらも参照してね。RubyPythonも、変数に対する考え方は一緒だよ。

そのほか、高林さんのブログのエントリ「配列操作の比較表: Ruby, Python, JavaScript, Perl, C++」がリストの要素の操作の参考になるよ。

トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20080704