Python 内包表記

リスト内包表記

タプルから要素を取り出してリストを作る

# タプルから要素を取り出してリストを作る
t = (1, 2, 3, 4, 5)

# forループを使う
r = []
for i in t:
    r.append(i)
print(r)          # [1, 2, 3, 4, 5]

# リスト内表記
r = [i for i in t]
print(r)          # [1, 2, 3, 4, 5]

条件式を使って偶数のみを取り出す

# タプルから偶数のみを取り出してリストを作る
t = (1, 2, 3, 4, 5)

# forループを使う
r = []
for i in t:
    if i % 2 == 0:
        r.append(i)
print(r)          # [2, 4]

# リスト内表記
r = [i for i in t if i % 2 == 0]
print(r)          # [2, 4]

2つのforループ

t = (1, 2)
t2 = (5, 6, 7)

# forループ
r = []
for i in t:
    for j in t2:
        r.append(i * j)
print(r)    # [5, 6, 7, 10, 12, 14]

# リスト内包表記
r = [i * j for i in t for j in t2]
print(r)    # [5, 6, 7, 10, 12, 14]

条件式

# 2重forの条件式
t = (1, 2, 3, 4)
t2 = (5, 6, 7, 8)

r = [i * j for i in t for j in t2]
print(r)  # [5, 6, 7, 8, 10, 12, 14, 16, 15, 18, 21, 24, 20, 24, 28, 32]

r = [i * j for i in t if i % 2 == 0 for j in t2]
print(r)  # [10, 12, 14, 16, 20, 24, 28, 32]

r = [i * j for i in t if i % 2 == 0 for j in t2 if j % 2 == 0]
print(r) # [12, 16, 24, 32]

forは何重にもつなげることができるが、つなげすぎるとわかりにくくなってしまう。

辞書包括表記

2つのリストを対応させた辞書を作成

w = ['mon', 'tue', 'wed']
f = ['coffee', 'milk', 'water']

# for文
for x, y in zip(w, f):
    d[x] = y
print(d)    # {'mon': 'coffee', 'tue': 'milk', 'wed' : 'water'}

# 辞書包括表記
d = {x: y for x, y in zip(w, f)}
print(d)    # {'mon': 'coffee', 'tue': 'milk', 'wed' : 'water'}

集合内包表記

集合内包表記はリスト内包表記とほぼいっしょ

s = set()

# for文で
for i in range(10):
    s.add(i)
print(s)      # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

# 集合内包表記で
s = {i for i in range(10)}
print(s)      # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

ジェネレーター内包表記

# ジェネレータを生成
def g():
    for i in range(10):
        yield  i

g = g()
print(next(g))  # 0
print(next(g))  # 1
print(next(g))  # 2
print(next(g))  # 3

# ジェネレーター内包表記
g = (i for in range(10))
print(next(g))  # 0
print(next(g))  # 1
print(next(g))  # 2
print(next(g))  # 3
print(type(g))  # <class 'genereator'>

()を使用しているのでタプルが生成されそうですが、typeを確認するとタプルではなくジェネレーターになっていることがわかります。

内包表記でタプルを生成するには、()の前にtupleと記述します。

g = tuple(i for in range(10))
print(g)        # (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
print(type(g))  # <class 'tuple'>

まとめ

リスト内包表記r = [i for i in t]
辞書内包表示d = {x: y for x, y in zip(x, y)}
集合内包表記s = {i for i in range(10)}
ジェネレーター内包表記g = (i for i in range(10))
タプル内包表記g = tuple(i for i in range(10))

コメント

タイトルとURLをコピーしました