集合_2(Python_10)

この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。 hirocom777.hatenadiary.org 前回は、集合について学びました。工夫すると色々使えるところがありそうです。

今回は、集合の使い道について学んでいきたいと思います。

集合の使い道

「値の重複を許さない」、「順番は保証されない」等の特徴を持つ集合ですが、どのような場面で使われるのでしょうか。

集合の計算を使う

前回ご紹介した集合の計算を、直接使用する方法です。2つの集合を使用すれば、要素がどの集合に所属するか状況が簡単にわかります。

# 出力結果の順番は保証されません
部署_1 = {'A','B','C'}
部署_2 = {'C','D','E'}
# 部署_1または、部署_2に所属するメンバー
print(部署_1 | 部署_2) # {'B', 'C', 'A', 'E', 'D'}
# 部署_1、部署_2どちらかに所属するメンバー
print(部署_1 ^ 部署_2) # {'B', 'E', 'A', 'D'}
# 部署_1、部署_2両方に所属するメンバー
print(部署_1 & 部署_2) # {'C'}
# 部署_1、のみに所属するメンバー
print(部署_1 -部署_2) # {'A', 'B'}

重複要素の削除

集合は中の要素には重複した値を設定できません。重複した値を持つリストを集合型変換すると、重複した値は削除されます。これをリストに再変換すれば、一意の値のみを持つリストを作成できます。ただし、順番は保証されません。

l_1 = [1,2,3,1]
l_1 = list(set(l_1))
print(l_1) # [1, 2, 3]を返す(順番は保証されない)

オブジェクトの比較

集合を使うとリスト、タプルを違う形で比較できます。

リスト、タプルの比較

今まで触れてきませんでしたが、リストやタプルなどのオブジェクトも比較演算子で判定できます。

  • 等しい、等しくない(==、!=)
    リスト(タプル)内のすべての要素が一致すれば等しい、そうでなければ等しくないと判定されます。異なる型のオブジェクトとは比較できません(エラーになる)。
  print((1,2,3) == (1,2,3)) # Trueを返す
  print((1,2,3) == (2,1,3)) # Falseを返す
  print((1,2,3) != (2,1,3)) # Trueを返す
  • 大小(<、>)
    それぞれの先頭の要素から順に比較され、最初の等価でない要素の比較結果が反映されます。
  print((1,2,3) < (1,3,2)) # Trueを返す
  print((1,2,3) < (1,3)) # Falseを返す
  print((1,2,3) < (1,2)) # Falseを返す

対応する要素がない場合には、要素数が少ないほうが小さいものと判定されます。

集合の比較

それでは集合の場合はどうなるのでしょうか。集合どうしで包含関係(片方の集合が、もう片方の集合に含まれているか)の結果で判定します。

  • 等しい、等しくない
    片方の集合のすべての要素がもう片方内に存在し、双方の要素数が等しい場合は等しくなります。これ以外は等しくないと判定されます。
  print({2,1,3} == {1,2,3}) # Trueを返す
  print({2,1,3} == {1,2,5}) # Falseを返す
  print({2,1,3} != {1,2,5}) # Trueを返す
  • 大小 片方の集合のすべての要素がもう片方内に存在し、さらにもう片方には別の要素がある場合、そちらの集合が大きいと判定されます。
  print({2,3} < {1,2,3}) # Trueを返す
  print({2,1} < {1,5}) # Falseを返す

双方の集合に、共有していない要素が存在する場合はどうなるのでしょうか。この場合は、大小の関係はなく等しくないという状態になります。

  print({1,2,3} < {1,2,5}) # Falseを返す
  print({1,2,3} > {1,2,5}) # Falseを返す
  print({1,2,3} != {1,2,5}) # Trueを返す

この様に集合の比較判定は、リストやタプルと異なります。つまりリストやタプルを集合に型変換すると、異なるルールでの比較判定ができます。

この機能を使うと、リストに必要なデータが入っているか、または不要なデータが入っていなてか確認するコードをシンプルに記述する、などが考えられます。

frozenset

集合とは別にfrozenset型というデータ型があります。frozenset型はイミュータブルな集合で、変更ができません。

次回は辞書

いかがでしょうか。集合を使えばデータの処理方法が広がります。次回は辞書です。今までのオブジェクトとは、ちょっと違いがあります。お楽しみに!!

hirocom777.hatenadiary.org

Python再学習のまとめはこちら!!