この連載では、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型はイミュータブルな集合で、変更ができません。
次回は辞書
いかがでしょうか。集合を使えばデータの処理方法が広がります。次回は辞書です。今までのオブジェクトとは、ちょっと違いがあります。お楽しみに!!