やり直しPython3(内包表記)

2016-04-22(Fri) by Makoto Yamahira

Python3の勉強(6) 内包表記

Python基礎勉強6日目です。今回は内包表記について。
内包表記を使うとイテレータを使ってオブジェクトをコンパクトに作ることができる。
内包表記を使えているかどうかは初心者レベルを卒業できているかどうかの一つの目印になるらしい。

リスト内包表記

forループを使ってリストを作ると次のような感じになる。

    >>> num_list = []
    >>> for i in range(0, 10):
    ...     num_list.append(i)
    ... 
    >>> num_list
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

リスト内包表記を使うと次のように書き換えることができる。

    >>> num_list = [i for i in range(0, 10)]
    >>> num_list
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

少し書き換えて次のようなリストを作ることもできる。

    >>> num_list = [i % 4 for i in range(0, 10)]
    >>> num_list
    [0, 1, 2, 3, 0, 1, 2, 3, 0, 1]

条件を追加することもできる。

    >>> num_list = [i for i in range(0, 10) if i % 3 == 0]
    >>> num_list
    [0, 3, 6, 9]

タプルを要素とするリストといったようなものも作れる。

    >>> num_list = [(i, i * 3) for i in range(0, 10)]
    >>> num_list
    [(0, 0), (1, 3), (2, 6), (3, 9), (4, 12), (5, 15), (6, 18), (7, 21), (8, 24), (9, 27)]

内包表記をネストして使うこともできる。 (複雑になるのでコードが読みにくくなりそうだが。。。)

    >>> num_list = [(i, j) for i in range(0, 3) for j in range(0, 2)]
    >>> num_list
    [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]

辞書内包表記

リストだけでなく辞書も内包表記で作ることができる。

    >>> three_times_dict = {i: i*3 for i in range(0, 5)}
    >>> three_times_dict
    {0: 0, 1: 3, 2: 6, 3: 9, 4: 12}

集合内包表記

集合も内包表記で作れる。

    >>> num_set = {i % 3 for i in range(0, 100)}
    >>> num_set
    {0, 1, 2}

タプル内包表記は無い(ジェネレータ内包表記になる)

タプルは内包表記が無い。
丸カッコを使って内包表記を書くとジェネレータオブジェクトが作られる。

    >>> num_gen = (i for i in range(0, 10))
    >>> num_gen
    <generator object <genexpr> at 0x101176cf0>

ジェネレータオブジェクトは呼び出し時に値を生成する。
一度にメモリを占有しないので、とても大きなシーケンスオブジェクトを使う場合には便利だ。
next()関数を使うと値を一つ取り出すことができる。

    >>> next(num_gen)
    0
    >>> next(num_gen)
    1

ジェネレータオブジェクトは一度作った値を覚えていない。
list()関数でキャストも利用できるので、上の例の残りの部分をキャストしてみる。

    >>> list(num_gen)
    [2, 3, 4, 5, 6, 7, 8, 9]

勉強に使っている本はオライリーの「入門Python3」


Comments