型についてのあれこれ(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]
もっともっと、いろいろな事が
- リスト内包表記 « python練習帳
- Pythonの内包表記の使い方まとめ - Life with Python
- Python のリスト内包表記 - Ruby や Haskell の書き方と比べながら | すぐに忘れる脳みそのためのメモ
zip関数
zip関数を使うと更にいろいろな事が (複数のリストの要素を組み合わせて演算をおこなう等の用途に)
- とりあえず: [Python][お勉強] Python入門(22) - zip関数
- Python の zip と map の違い | すぐに忘れる脳みそのためのメモ
- forループで便利な zip, enumerate関数 » Python Snippets
enumerate関数も便利。
リストの内包表記 (list comprehension) は、 map() や filter() や lambda を使わずにリストを生成するための簡潔な方法を提供しています。
内包表記によるリストの定義は、たいてい map(), filter(), lambda を使ってリストを生成するコードよりも明快になります。
Haskellにはモナドの内包表記というものが
pythonから少し話がそれるが、Haskellにはモナドの内包表記というものがあるらしい。