【python】集合(set)の使い方とそのメリットを解説

python

pythonのsetの使い方を調べる人

pythonのsetの使い方を調べる人
「pythonのsetの使い方を知りたいです。どのような時に使うと効果的ですか?正直、わざわざsetを使わなくてもlistで何でもできてしまうので問題ないんですが、勉強不足でしょうか?具体的な使用例としてコピペできるソースコードも欲しいです。」

こんな疑問を解決します。

setの作り方と簡単な使い方

setの使い方の概要

“データの列”を中カッコで括るだけでsetが作れます。setの作り方と簡単な演算の例を示します。

 
>>> setの作り方
>>> { 1,2,3 }
{1, 2, 3}

>>> 重複は自動的に排除されます
>>> { 1,2,3,1 }
{1, 2, 3}

>>> setとsetの足し算
>>> { 1,2,3 } | {0}
{0, 1, 2, 3}

>>> setとsetの引き算
>>> { 1,2,3 } - {1}
{2, 3}
 

 


setはlistやtupleなどと同様に、pythonで複数のデータを扱う時に使われるデータ構造です。ここからは、setの特徴について詳しく見ていきたいと思います。

本記事の内容

  • setとlistの違い
  • setを理解すれば開発効率がアップする
  • setを理解すれば保守性もアップする

 
この記事を書いている私はIT業界歴12年、年収1,000万円ちょっとの金融系エンジニアです。学生時代から様々なプログラミング言語を扱ってきましたが、その中でもpythonはとても扱いやすく生産性も高く、オススメの言語です。

本記事では、pythonでsetを用いることでデータの処理をシンプルにコーディングすることができ、開発効率と保守性がアップすることを、幾つかの例を挙げながら解説します。

例では具体的なプログラムコードを示し、細かい構文に迷ったときにコピー&ペーストして使えることも目指しました。少しでもお役に立てますと幸いです。

setとlistの違い

setとlistの違い

setはlistとは何が違うのでしょう。setにはlistとは異なる2つの特徴があります。

  • ①setは要素の重複を許さない
  • ②setは要素に順序性を持たない

listをsetに変換してみるとその違いがよくわかります。

①setは要素の重複を許さない

実際にlistをsetに変換してみます。listには要素'3'が2つありますが、setに変換すると重複が排除され、1つになります。

 
>>> [ 1,2,3,3 ]
[1, 2, 3, 3]

>>> set([ 1,2,3,3 ])
{1, 2, 3}
 

 
このように、setは要素の重複を許容しません。ですからsetは社員IDなどユニークなデータを管理するのに適しています。一方、社員名や生年月日など、重複するデータを扱うのには向いていません。

②setは要素に順序性を持たない

次に順序性についてみていきます。listとsetそれぞれ、順序を入れ替える前後で比較してみます。

 
>>> [ 1,2,3 ] == [3,2,1]
False

>>> { 1,2,3 } == {3,2,1}
True
 

 
順序の入れ替わったlistは別物として扱われるため、同じ物と見なされません。一方でsetには順序性がないので、入れ替えて表現しても同値として扱われます。

setに順序が無いという意味を社員IDを扱う場合に置き換えて考えてみましょう。社員IDの順序はIDが若い順では無いのか?と思われる方もいらっしゃるかもしれませんが、IDの順に本質的な意味は無いはずです。もちろんIDを若い順に並べると入社順になるとか何らかの意味はあるでしょうが、あくまでそれは副次的な意味であって、本質ではないのです(本質的には、入社年月日が別に管理されているはずです)。そして、社員IDのようなユニークデータを処理する場合、基本的に順序に関係なく処理が可能です。

もしIDの若い順や年収順など、データを何らかの順序に並べたい時は、順序を定義して並べたlistに出力して用いるのが一般的です。

setを理解すれば開発効率がアップする

setを理解すれば開発効率がアップする

社員IDなどのユニークなデータを扱う場合にsetを用いると、あらかじめ用意された機能を用いて特定の処理を1行〜数行に短縮して記述できるため、開発効率が高まります。

例えばリストの重複を削除するのは、先ほどの例で示したset関数を適用するだけです。重複を排除してデータ処理したい場合に便利です。

 
>>> set([ 1,2,3,3,3,2,2,1,2,1,3 ])
{1, 2, 3}
 

他の例も順に示します。

データのサンプリング処理を1行で書ける

listやsetにはpopメソッドがあり、要素を抽出することができます。

listの場合は何番目の要素を取得するか指定しなくてはなりません(デフォルトは末尾の要素)が、setの場合は順序の概念がないため、ランダムに要素をサンプリングすることができます。

 
>>> print({1, 2, 3}.pop())
1
 

例:数学も理科もプログラミングも得意な人を1行で抽出する

数学が得意な人の出席番号のsetをA、理科が得意な人の出席番号のsetをB、プログラミングが得意な人の出席番号のsetをCとして、数学も理科も体育も得意な人を1行で抽出します。

 
>>> A={5,9,16,20,27}
>>> B={1,4,9,12,19,27}
>>> C={9,15,27,31,40}
 

全部得意なのは次の2人でした。

 
>>> A & B & C
{9, 27}
 

例:pythonかjavaのどちらかで開発できる人を1行で抽出する

pythonの開発ができる人の社員IDのsetをX、javaの開発ができる人の社員IDのsetをYとして、pythonかjavaのどちらかの開発ができる人を1行で抽出します。

 
>>> X={5,9,16,20,27}
>>> Y={1,4,9,12,19,27}
 

pythonかjavaのどちらかで開発できるのは次の9人でした。

 
>>> X | Y
{1, 4, 5, 9, 12, 16, 19, 20, 27}
 

その他の機能(len(),in,.issubset(),.issuperset())

その他の機能を紹介します。

 
>>> len({1,2,3}) #set内にある要素数を算出
3

>>> 2 in {1,2,3} #set内の要素であればTrue
True
>>> 4 in {1,2,3} #set内の要素でなければFalse
False

>>> {2,3}.issubset({1,2,3}) #set内の要素からなるset(部分集合)ならTrue
True
>>> {1,4}.issubset({1,2,3}) #部分集合でなければFalse
False

>>> {1,2,3}.issuperset({1,2}) #setを含む集合(上位集合)ならTrue
True
>>> {1,2,3}.issuperset({1,4}) #上位集合でなければFalse
False

 

setを理解すれば保守性もアップする

setを理解すれば保守性もアップする

setを使うと開発効率がアップするだけではなく、保守性もアップします。それはこれまでに示してきたように、短いコードで美しく表現できるからです。setを使えばlistでゴリゴリ書くよりもシンプルに書けるので、開発効率だけではなく保守性も高まるのです。

今回は以上です。setを使いこなせると超便利だよ、というお話でした。本記事の内容がプログラミングする際の参考になりましたら幸いです。

pythonは自動車、半導体メーカーなどでも使われています