内包表記を使ってリストや辞書、集合を作成する方法、if句や条件式と組み合わせる方法などを1ページにまとめて紹介する。
ここでは、本連載でここまでに取り上げてきた内包表記を使ってリスト/辞書/集合を作成する方法をまとめる。詳しい解説はコード例の後で紹介しているリンクを参照してほしい。
# リスト内包表記
squares = [n ** 2 for n in range(5)]
print(squares) # [0, 1, 4, 9, 16]
# 反復可能オブジェクトから渡される値を使用しない例
from random import randint
random_nums = [randint(1, 5) for _ in range(5)]
print(random_nums) # [1, 5, 2, 1, 5]など
# 'a'〜'z'を要素とするリストの作成
chars = [chr(n + ord('a')) for n in range(26)]
print(chars) # ['a', 'b', 'c', 'd', 'e', 'f', 'g', ……, 'v', 'w', 'x', 'y', 'z']
# 'a'〜'z'のASCII値を要素とするリストの作成
s = ''.join(chars)
print(s) # abcdefghijklmnopqrstuvwxyz
ords = [ord(c) for c in s] # 「ords = [ord(c) for c in chars]」でも同様
print(ords) # [97, 98, 99, 100, 101, 102, 103, ……, 118, 119, 120, 121, 122]
# enumerate関数との組み合わせ
words = ['foo', 'bar', 'baz']
indexed_words = [(idx, word) for idx, word in enumerate(words)]
print(indexed_words) # [(0, 'foo'), (1, 'bar'), (2, 'baz')]
# zip関数との組み合わせ
nums1 = [1, 2, 3, 4, 5]
nums2 = [5, 4, 3, 2, 1]
sums = [num1 + num2 for num1, num2 in zip(nums1, nums2)]
print(sums) # [6, 6, 6, 6, 6]
# for句のネスト
nums = [[num1, num2] for num1 in range(3) for num2 in range(2)]
print(nums) # [[0, 0], [0, 1], [1, 0], [1, 1], [2, 0], [2, 1]]
# リスト内包表記のネスト:九九の表を5の段まで
multbl = [[x * y for y in range(1, 10)] for x in range(1, 6)]
for row in multbl:
print(row)
# 出力結果
#[1, 2, 3, 4, 5, 6, 7, 8, 9]
#[2, 4, 6, 8, 10, 12, 14, 16, 18]
#[3, 6, 9, 12, 15, 18, 21, 24, 27]
#[4, 8, 12, 16, 20, 24, 28, 32, 36]
#[5, 10, 15, 20, 25, 30, 35, 40, 45]
# if句を使用して、要素を計算する前にフィルタリングをする
r = range(11)
odd_list = [x for x in r if x % 2]
print(odd_list) # [1, 3, 5, 7, 9]
even_list = [x for x in r if x % 2 == 0]
# even_list = [x for x in r if x not in odd_list]
print(even_list) # [0, 2, 4, 6, 8, 10]
# 内包表記の要素を決定する式で条件式(三項演算子)を使う
odd_even_list = [(x, 'odd') if x % 2 else (x, 'even') for x in r]
print(odd_even_list)
# 出力結果
#[(0, 'even'), (1, 'odd'), (2, 'even'), (3, 'odd'), (4, 'even'), (5, 'odd'),
# (6, 'even'), (7, 'odd'), (8, 'even'), (9, 'odd'), (10, 'even')]
# if句と代入式の組み合わせ
numlist = [0.06, 0.85, 0.96, 0.79, -0.73, 0.30, -0.81, -0.57, 0.56, 0.32]
def f(x):
return x + 0.5 # ここでは「何らかの処理」=0.5を加える
numlist2 = [(x, y) for x in numlist if (y := f(x)) > 1]
print(numlist2) # [(0.85, 1.35), (0.96, 1.46), (0.79, 1.29), (0.56, 1.06)]
内包表記によるリストの作成の基本については「内包表記でリストを作成するには」を、内包表記とif(if句、条件式)を組み合わせる方法については「リストの内包表記と『if』を組み合わせるには」を参照のこと。
# 辞書内包表記の基本型
d = {k: k ** 2 for k in range(5)}
print(d) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 辞書内包表記とzip関数との組み合わせ
articles = [
'リストの内包表記と「if」を組み合わせるには',
'内包表記でリストを作成するには',
'バイナリファイルの読み書きまとめ',
'テキストファイルの読み書きまとめ'
]
urls = [
'https://www.atmarkit.co.jp/ait/articles/2107/06/news020.html',
'https://www.atmarkit.co.jp/ait/articles/2106/29/news021.html',
'https://www.atmarkit.co.jp/ait/articles/2106/22/news022.html',
'https://www.atmarkit.co.jp/ait/articles/2106/15/news016.html'
]
d = {title: url for title, url in zip(articles, urls)}
for title, url in d.items():
print(f'{title}: {url[-20:]}')
# 出力結果:
#リストの内包表記と「if」を組み合わせるには: 2107/06/news020.html
#内包表記でリストを作成するには: 2106/29/news021.html
#バイナリファイルの読み書きまとめ: 2106/22/news022.html
#テキストファイルの読み書きまとめ: 2106/15/news016.html
# 同じことはdict関数でもできる
d = dict(zip(articles, urls))
for title, url in d.items():
print(f'{title}: {url[-20:]}') # 出力結果は上に同じ
# 反復可能オブジェクトから得た値を加工するには内包表記を使う
d = {t: u[-20:] for t, u in zip(articles, urls) if '内包表記' in t}
for title, url in d.items():
print(f'{title}: {url}')
# 出力結果:
#リストの内包表記と「if」を組み合わせるには: 2107/06/news020.html
#内包表記でリストを作成するには: 2106/29/news021.html
内包表記を使って辞書を作成する詳細については「内包表記で辞書を作成するには」を参照のこと。
# 集合内包表記の基本型
squared = {n ** 2 for n in range(10)}
print(squared) # {0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
# 集合なので同じ値の要素が重複することはない
mystr = 'abccba'
diff = ord('a') - ord('A') # 32
myset = {chr(ord(c) - diff) for c in mystr}
print(myset) # {'A', 'C', 'B'}
# 単に重複する要素を削除したいのであればset関数を使う
mystr = 'abccba'
myset = {c for c in mystr}
print(myset) # {'a', 'b', 'c'}
myset = set(mystr)
print(myset) # {'a', 'b', 'c'}
# if句と組み合わせる
mylist = [7, 4, 4, 7, 5, 9, 8, 5, 1, 10]
myset = {n for n in mylist if n % 2 == 0} # mylistから偶数のみの集合を作成
print(myset) # {8, 10, 4}
内包表記を使って集合を作成する詳細については「内包表記で集合を作成するには」を参照のこと。
Copyright© Digital Advantage Corp. All Rights Reserved.