FrontPage  Index  Search  Changes  RSS  Login

[python]set型(集合型)

set型(集合型)

set型はPythonのビルトインオブジェクトです。その名が表す通り、集合を表現するためのオブジェクトになります。

setとfrozenset

set型には、変更可能であるsetと変更不可能であるfrozensetという2種類が存在します。

両方に共通する特徴として以下を挙げる事が出来ます。

  • メンバは重複しない
  • 順序を持たない

両者の違いとして大きなものは、ハッシュ値を持つか持たないかだと思います。

  • Pythonでは値を変更可能なオブジェクトを辞書などのキーに利用する事は出来ません
  • 集合の集合を表現したい場合、frozensetを要素とするsetとして実装する事になるでしょう

演算

集合型(setおよびfrozenset)は、以下の演算をサポートします。

オペレーション(同等の表現)意味
len(s) 集合sの基数
x in s 集合sのメンバにxがある場合に真
x not in s 集合sのメンバにxがない場合に真
s.issubset(t)s <= t集合tに集合sの要素が全て含まれているなら真
s.issuperset(t)s >= t集合sに集合tの要素が全て含まれているなら真
s.union(t)s | t集合sと集合tに含まれる全ての要素を持った新しい集合を作成する
s.intersection(t)s & t集合sと集合tの共通要素からなる新しい集合を作成する
s.difference(t)s - t集合sに存在して集合tには存在しない要素からなる新しい集合を作成する
s.symmetric_difference(t)s ^ t集合sと集合tどちらかにしか存在しない要素からなる新しい集合を作成する
s.copy() 集合sからシャローコピーによって新しい集合を作成する
>>> s = set([1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5])
>>> s
set([1, 2, 3, 4, 5])
>>> len(s)
5
>>> 1 in s
True
>>> 10 in s
False
>>> 1 not in s
False
>>> 10 not in s
True
>>> s.issubset(set([1, 2, 3, 4, 5, 6]))
True
>>> s.issubset(set([1, 4, 5]))
False
>>> s.issuperset(set([1, 3]))
True
>>> s.issuperset(set([1, 10]))
False
>>> s.union(set([11, 21]))
set([1, 2, 3, 4, 5, 11, 21])
>>> s.intersection(set([1, 3, 5, 7, 9]))
set([1, 3, 5])
>>> s.difference(set([1, 3, 5, 7, 9]))
set([2, 4])
>>> s.symmetric_difference(set([2, 3, 4]))
set([1, 5])
>>> t = s.copy()
>>> t
set([1, 2, 3, 4, 5])
>>> id(s)
406192
>>> id(t)
406992
  • 表中で同等の表現として演算子を表記していますが、注意が必要です
    • メソッドを利用する場合、引数にはiterableなオブジェクト(シーケンス型など)を許容します
      • union(), intersection(), difference(), symmetric_difference(), issubset(), issuperset()
    • 演算子を利用する場合、被演算子はset型でなければなりません
>>> set('aiueo').difference('auo')
set(['i', 'e'])
>>> set('aiueo') - 'auo'
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: unsupported operand type(s) for -: 'set' and 'str'
>>> set('aiueo') - set('auo')
set(['i', 'e'])

set型の比較は、そのメンバに基づいて行われます。

>>> set('xyz') == set('xyz')
True
>>> set('xyz') == set('xyzab')
False
>>> set('xyz') == frozenset('xyz')
True

set型同士の比較を行う場合、一方が一方のサブセットであるか等しく無い限り、以下の比較演算は全てFalseを返します。

  • a > b
  • a == b
  • a < b

この事から、set型は__cmp__メソッドを実装していません。

つまり、set型の順序付けは部分的(サブセット判定)であるため、list.sort()の結果は不確定となります。

setとfrozensetとを混在させたバイナリ演算を行った場合、1つめの非演算子の型で返します。

>>> set('xyz') | frozenset('abc')
set(['a', 'c', 'b', 'y', 'x', 'z'])
>>> frozenset('xyz') | set('abc')
frozenset(['a', 'c', 'b', 'y', 'x', 'z'])

リスト操作

setは、以下のリスト操作をサポートします。frozensetは変更不可能であるため適用されません。

オペレーション(同等の表現)意味
s.update(t)s |= t集合sに集合tのメンバを追加して更新し、更新後のsを返します
s.intersection_update(t)s &= t集合tにも含まれるメンバからなる集合sに更新し、更新後のsを返します
s.difference_update(t)s -= t集合tに含まれる要素を集合sから削除して更新し、更新後のsを返します
s.symmetric_difference_update(t)s ^= t集合sと集合tの一方にしか存在しないメンバで集合sを更新し、更新後のsを返します
s.add(x) 集合sにメンバxを追加します
s.remove(x) 集合sからメンバxを削除します(xが存在しない場合はKeyError)
s.discard(x) 集合sにメンバxが存在した場合にメンバxを削除します
s.pop() 集合sから任意のメンバを削除して、そのメンバを返します(空の場合KeyError)
s.clear() 集合sから全てのメンバを削除します

update(), intersection_update(), difference_update(), symmetric_difference_update()のはiterableなオブジェクトを引数を許容します。

Last modified:2007/05/24 00:59:41
Keyword(s):
References: