ホーム > 記事 > Python > python入門 > 【Python】内包表記

記事

【Python】内包表記

ここでは内包表記について述べます。内包表記はイテレータを式で評価することで新たなリストや集合、ジェネレータを生成する表記方法です。処理速度が早く、本来であれば複数行にわたる繰り返しループが必要な処理を簡潔に記述できます。

内包表記は以下のような表記になっています。

評価式 for i in イテレータ

これをリストで囲うとリスト内方表記になりますし集合(set)で囲うとset内包表記になります。それぞれについて詳しくみてゆきます。

 

目次

  1. リスト内包表記
    1. 条件分岐がある場合
    2. elseがある場合
    3. zipと組み合わせて使う
    4. enumrateと組み合わせて使う
    5. ネストさせて使う
  2. 集合内包表記
  3. 辞書内包表記
  4. ジェネレータ式
  5. タプルに格納
  6. まとめ

リスト内包表記

リスト内方式の基本形は以下のような形をしています。

[ 式 for i in イテレータ ]

実装例

l = [ i % 3 for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

print(l)

実行結果

[0, 1, 2, 0, 1, 2, 0, 1, 2, 0]

↑目次

条件分岐がある場合

内包表記ではforの後に: を省略してifなどの条件分岐を入れることができます。例えば3の倍数のみを取り出す例は以下のようになります。

実装例

l = [ i for i in range(1,10) if i % 3 == 0]

print(l)

実行結果

[3, 6, 9]

↑目次

elseが入る場合

ifの中にelseが入る場合は3項演算子で表現するためifの位置が変わります。例えば3の倍数の場合True、3の倍数以外はFalseとする場合以下のようになります。

l = [ True if i % 3 == 0 else False for i in range(1,10) ]

print(l)

実行結果

[False, False, True, False, False, True, False, False, True]

↑目次

zipと組み合わせて使う

まずzipについて述べます。zipは複数のイテラブルオブジェクトを同じ順番でまとめます。

a1=['東京都','神奈川県','大阪府','愛知県']
b1=[13515271,9126214,8839469]

for a2,b2 in zip(a1,b1):
    print(a2+', '+str(b2))

実行結果

東京都, 13515271
神奈川県, 9126214
大阪府, 8839469

片方のリストが長い場合には、長い配列が打ち切られ、短い配列に長さを合わせた上でzipされます。

上記を内包表記で記述すると以下のようになります。

a1=['東京都','神奈川県','大阪府','愛知県']
b1=[13515271,9126214,8839469]

l=[(a2,b2) for a2,b2 in zip(a1,b1)]

print(l)

実行結果

[('東京都', 13515271), ('神奈川県', 9126214), ('大阪府', 8839469)]

↑目次

enumerateと組み合わせて使う

連番を振るときなどenumerateを用います。

l=['東京都','神奈川県','大阪府','愛知県']
lc=[(i,a) for i,a in enumerate(l)]

print(lc)

実行結果

[(0, '東京都'), (1, '神奈川県'), (2, '大阪府'), (3, '愛知県')]

↑目次

ネストさせて使う

内包式はネストすることができます。

a = [1,2,3,4]
l = [ k * k for k in [j*j for j in [ i*i for i in a ] ] ]

print(l)

実行結果

[1, 256, 6561, 65536]

↑目次

集合内包表記

いままで内包表記の処理結果をリストに格納しましたが、そのほかのイテラブルに入れることもできます。以下は集合に入れる例です。

l = set( i%9 for i in range(1,100) )

print(l)

実行結果

{0, 1, 2, 3, 4, 5, 6, 7, 8}

↑目次

辞書内包表記

内包表記の結果を辞書にセットすることができます。

l = { i:i*i for i in range(1,20) }

print(l)

実行結果

{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100, 11: 121, 12: 144, 13: 169, 14: 196, 15: 225, 16: 256, 17: 289, 18: 324, 19: 361}

↑目次

ジェネレータ式

内包表記を()で囲うとタプルではなくジェネレータ式となります。

l = ( i*i for i in range(1,20) )

print(l)

実行結果

<generator object=""> at 0x00000234E74C9510></generator>

ジェネレータですので実際に呼び出されるまで値は生成されません。そのため実際に値を取り出すには内包表記やループを使う必要があります。以下は内包表記のジェネレータから内包表記を使って値をとりだす例です。

l = [ i for i in ( i*i for i in range(1,20) ) ]

print(l)

実行結果

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]

ループで値を取り出す場合

for i in ( i*i for i in range(5) ):
    print(i)

実行結果

0
1
4
9
16

↑目次

タプルに格納する

かっこ()で囲むとタプルではなくジェネレータになりました。タプルに格納したい場合にはtuple()を用います。

t=tuple( i*i for i in range(5) )

print(t)

実行結果

(0, 1, 4, 9, 16)

↑目次

まとめ

内包表記を使った記述方法を実例を用いて説明してみました。内包表記は記述がシンプルになるだけでなくループを回して処理するより高速に処理をおこなうことができます。ぜひマスターしてシンプルな記述ができるようになって下さい。

↑目次

この記事へのコメント

コメントはまだありません。

コメントを送る

必須
必須  
※ メールアドレスは公開されません
任意
必須
Loading...  画像の文字を入力してください