ここでは内包表記について述べます。内包表記はイテレータを式で評価することで新たなリストや集合、ジェネレータを生成する表記方法です。処理速度が早く、本来であれば複数行にわたる繰り返しループが必要な処理を簡潔に記述できます。
内包表記は以下のような表記になっています。
評価式 for i in イテレータ
これをリストで囲うとリスト内方表記になりますし集合(set)で囲うとset内包表記になります。それぞれについて詳しくみてゆきます。
ここでは内包表記について述べます。内包表記はイテレータを式で評価することで新たなリストや集合、ジェネレータを生成する表記方法です。処理速度が早く、本来であれば複数行にわたる繰り返しループが必要な処理を簡潔に記述できます。
内包表記は以下のような表記になっています。
評価式 for i in イテレータ
これをリストで囲うとリスト内方表記になりますし集合(set)で囲うとset内包表記になります。それぞれについて詳しくみてゆきます。
リスト内方式の基本形は以下のような形をしています。
[ 式 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]
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は複数のイテラブルオブジェクトを同じ順番でまとめます。
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を用います。
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)
内包表記を使った記述方法を実例を用いて説明してみました。内包表記は記述がシンプルになるだけでなくループを回して処理するより高速に処理をおこなうことができます。ぜひマスターしてシンプルな記述ができるようになって下さい。
この記事へのコメント
コメントはまだありません。
コメントを送る