[解決!Python]内包表記を使ってリスト/辞書/集合を作成する方法まとめ解決!Python

内包表記を使ってリストや辞書、集合を作成する方法、if句や条件式と組み合わせる方法などを1ページにまとめて紹介する。

» 2021年07月27日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「解決!Python」のインデックス

連載目次

内包表記を使ってリスト/辞書/集合を作成する方法まとめ


 ここでは、本連載でここまでに取り上げてきた内包表記を使ってリスト/辞書/集合を作成する方法をまとめる。詳しい解説はコード例の後で紹介しているリンクを参照してほしい。

リスト

# リスト内包表記
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}


 内包表記を使って集合を作成する詳細については「内包表記で集合を作成するには」を参照のこと。

「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。