型についてのあれこれ(6) - リストの操作

【 目次 】

リストの操作

リストをスタックとして使う。
pythonではpushの代わりにappendメソッドを使う。

stack = [3, 4, 5]
stack.append(6) # pushメソッドの代わりにappendを使う。
print stack.pop()

リストの内包表記

こんなものが何の役に立つのかな

「リストの内包表記は map() よりもはるかに柔軟性があり、複雑な式や入れ子になった関数でも利用できます。」

そうか、元リストから様々なリストを加工して作り出せるというわけか。
ウーン、でも処理の順番がどうなっているか慣れるまで読み難い。

内包表記の例を上記のドキュメントより引用すると。

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]

リストの内包表記は[3*x for x in vec]の部分になる。
これは、for x in vecによりリスト変数vecより1個づつ要素を取り出してxに代入して、3*xの演算をおこないその結果のリスト、すなわち [6, 12, 18]を返す。

map関数で表せば、

>>> def mul3(x): return 3*x
... 
>>> map(mul3, vec)
[6, 12, 18]

リストの内包表記を使わずに通常のfor文では

>>> L = []
>>> for x in vec:
...     L.append(3*x)
... 
>>> L
[6, 12, 18]

if文を使って処理対象のリストの要素を絞り込む事もできる。
vecの要素の中で3より大きい要素に対してのみ処理をおこなう。

>>> [3*x for x in vec if x > 3]
[12, 18]

他にもいろいろな事ができる。

>>> [[x,x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]
>>> [(x, x**2) for x in vec]
[(2, 4), (4, 16), (6, 36)]
>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]

もっともっと、いろいろな事が

zip関数

zip関数を使うと更にいろいろな事が (複数のリストの要素を組み合わせて演算をおこなう等の用途に)

リストの内包表記 (list comprehension) は、 map() や filter() や lambda を使わずにリストを生成するための簡潔な方法を提供しています。
内包表記によるリストの定義は、たいてい map(), filter(), lambda を使ってリストを生成するコードよりも明快になります。

Haskellにはモナドの内包表記というものが

pythonから少し話がそれるが、Haskellにはモナドの内包表記というものがあるらしい。

ページのトップへ戻る