【Python初学者】内包表記とは?リスト・集合・辞書内包表記について解説!

Python初学者シリーズ、内包表記(リスト内包表記、集合内包表記、辞書内包表記)

この記事は、プログラミング初学者が学びのアウトプットを兼ねてまとめた内容です。

どうもわだです

この記事では、
「リスト・集合内・辞書内包表記の基本構文と使い方」について
初学者目線で解説します。

目次

 for文やif文を含んだコードをシンプルに書ける構文のことです。
  内包表記には、リスト内包表記、集合内包表記、辞書内包表記といった種類があります。

[式 for 変数 in イテラブル if 条件] 

リストなので[ ]を使います
・式: 新しいリストの各要素をどのように生成するかを書きます
・for 変数 in イテラブル: 元のデータを順番に取り出すと言う意味です
・if 条件: 条件を指定したいときに書きます(省略可能)

イテラブルとは、繰り返し処理ができるオブジェクトのことです。

使い方の例(通常のfor文と比較)

✏️リストの要素を2乗してリストで返す

numbers = [1, 2, 3, 4, 5]
squares = [ ]
for n in numbers:
    squares.append(n ** 2)

print(squares)  # [1, 4, 9, 16, 25]
numbers = [1, 2, 3, 4, 5]
squares = [n ** 2 for n in numbers]

print(squares)  # [1, 4, 9, 16, 25]
numbers = [1, 2, 3, 4, 5, 6]
odds = [n for n in numbers if n % 2 == 1]

print(odds)  # [1, 3, 5]
numbers = [1, 2, 3, 4, 5, 6]
data = [n if n % 2 == 1 else 0 for n in numbers]

print(date)  # [1, 0, 3, 0, 5, 0]
text = "Python”
letters = [c.upper( ) for c in text]

print(letters)  # ['P', 'Y', 'T', 'H', 'O', 'N']
{式 for 変数 in イテラブル if 条件} 

集合なので{ }を使います
・if条件は省略可能です
・重複は自動的に取り除かれます

numbers = [1, 2, 3, 4, 4, 5]
squares = {n ** 2 for n in numbers}

print(squares)  # {1, 4, 9, 16, 25}

集合なので重複した値は排除されます。

odds = {n for n in range(1, 11) if n % 2 == 1}

print(odds)  # {1, 3, 5, 7, 9}
text = "programming"
vowels = {c for c in text if c in "aiueo"}

print(vowels) # {'i', 'a', 'o'}や{'o', 'a', 'i'}

集合なので順序は保持されません。

 {キー: 値 for 変数 in イテラブル if 条件} 

辞書なので{キー: 値}を使います
・if条件は省略可能です

使い方の例

squares = {n : n ** 2 for n in range(1, 6)}

print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
text = "wada"
counter = {c : text.count(c) for c in set(text)}

print(counter) # {'w': 1, 'a': 2, 'd': 1}

ちょっと待って!
どうしてtextではなくset(text)なのかわからない人いませんか?
(わだのための備忘録も兼ねて書いておきます。)
(師匠に教えていただいたことをそのまま失礼します。)

ポイントは処理の「効率」だよ!

for c in textの場合
実行すると”w”, “a”, “d”, “a”と1つ目から最後のアルファベットまで全部、つまり”a”は2回処理されることになる。
for c in set(text)の場合
setは重複を除いた文字をループ、つまり”w”, “a”, “d”それぞれが1回だけ処理されることになる。

辞書は重複するキーはもてないから、すでに同じキーが存在するときは上書きされて、実行結果は同じになるけれど、処理の量に差があるよね!

今回のように小さなデータではsetの必要性を理解しにくいけど、大きなデータを扱うことをイメージすると、setの重要さがわかってくるんじゃないかい?

なるほど!

つまり、無駄をなくして効率的に処理をするためにset(text)を使うということだね!

squares = {n : n ** 2 for n in range(1, 6) if n % 2 == 1}

print(squares) # {1: 1, 3: 9, 5: 25}

 どうも、プログラミング初学者のわだです。最後までお読みいただきありがとうございました。この記事は、学びを整理しながら理解を深めるために書いています。まだ駆け出しではありますが、同じように勉強している方の参考になれば嬉しいです。もし誤りや補足があれば、教えていただけると幸いです。

参考:
Python公式ドキュメント(日本語版)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

どうもこんにちは、わだです。プログラミングなんて未知の世界。そんなわだがエンジニアになるまでを綴っていきます。

コメント

コメントする

目次