Pythonの集合内包表記(set)の基本と使い方

  • 公開日:2018/11/08
  • 更新日:2018/11/11
  • 投稿者:n bit

Pythonでリスト内包表記を使ってコード内容を簡潔にすることができますが、同じように集合(set)でも集合内包表記を記述できます。今回はその集合内包表記の基本と使い方についての解説。基本的な考え方はリスト内包表記と同じです。

  • Python

この記事は約 分で読めます。(文字)

Pythonの集合内包表記

リスト内包表記ページの冒頭でも解説しましたが内包表記はリスト以外にdictやsetでも利用することが可能です。

今回はその中の『集合内包表記(set)』について学習していきましょう。集合内包表記はリスト内包表記がlistからsetに置き換わっただけと考えれば十分です。

『内包表記』の基本的な考え方についてはリスト内包表記ページで詳しく解説しています。まだご覧になっていない方は先にそちらのページをご確認ください。

集合内包表記の記述方法

では早速集合内包表記の記述方法を確認していきましょう。集合内包表記の基本的な記述方法は以下のようになります。

  • {新に格納する要素 for 配列内要素 in 配列}

最終的に集合を生成しますので波カッコ『 { } 』で挟み、『新に格納する要素』を最初に記述し、その後は通常のfor文と同じです。リスト内包表記の時とはカッコの形状が変わるだけですね。

実際にコードを確認したほうが早いでしょう。下記のサンプルコードは集合内包表記を使ってtupleから取得した値を2乗して新しいsetを作成した事例です。

nums = (4,8,9,17,33,68,56)

nums_2xset = {i ** 2 for i in nums}

print(nums_2xset)

出力結果

{64, 1089, 289, 3136, 16, 81, 4624}
  • ※ 集合はシーケンスオブジェクトではないため出力結果の要素順序は違う可能性があります。その点にご注意ください。

シーケンスオブジェクトについては下記のページで詳しく解説しています。

集合内包表記で利用されるサンプルコード

集合内包表記でもリスト内包表記のようにif文と合わせて利用することができます。集合内包表記で利用される事例をサンプルコード付きで紹介しておきましょう。

集合内包表記でif文も利用する場合のサンプルコード

集合内包表記内でif文と合わせて利用する場合の事例です。

tupple内の要素から偶数のみを抽出して新しい集合を生成する事例で考えてみましょう。偶数かどうかは2で割って余りがゼロになるかどうかで判定します。

i % 2 == 0

まずは通常通りのfor文とif文の組み合わせでaddメソッドを使ってtupple内の要素から集合を生成する場合のコードです。

nums = (4,8,9,17,33,68,56)

nums_even_set = set()

for i in nums:
if i % 2 == 0:
nums_even_set.add(i)

print(nums_even_set)

出力結果

{8, 56, 4, 68}

下記のサンプルコードは上記のコードを集合内包表記を使って置き換えたものです。if文はfor文の後にそのまま続けて記述することで利用できます。

nums = (4,8,9,17,33,68,56)

nums_even_set = {i for i in nums if i % 2 == 0}

print(nums_even_set)

出力結果

{8, 56, 4, 68}

今日のdot

集合内包表記とリスト内包表記はほとんど違いがありません。利用の仕方はほぼ同じです。違いが出てくるのはリストと集合の特性がそもそも違うのでその部分に関連するところで出てきます。

例えばsetの中にはlistやsetを2次元で格納することができません。そのためリスト内包表記のサンプルコードで示したfor文を入れ子にして2次元配列を作ったような事例は考えにくいでしょう。

集合の特徴は重複する要素を自動的に1つにまとめてくれることです。その特徴を生かせる時に集合内包表記を活用しましょう。

▲ ページの先頭へ戻る

このページの目次

目次