Pythonのセット

Pythonのセット

おそらく、数学教育のある時点でsetsset theoryについて学んだことを思い出します。 ベン図を覚えているかもしれません:

Venn diagram

これがベルを鳴らさなくても、心配しないでください! このチュートリアルはまだ簡単にアクセスできるはずです。

数学では、集合の厳密な定義は抽象的であり、把握するのが難しい場合があります。 ただし、実際には、セットは、通常はelementsまたはmembersと呼ばれる明確に定義された個別のオブジェクトのコレクションと単純に考えることができます。

オブジェクトをセットにグループ化することは、プログラミングにも役立ちます。Pythonには、そのための組み込みセットタイプが用意されています。 セットは、実行できる一意の操作によって他のオブジェクトタイプと区別されます。

Here’s what you’ll learn in this tutorial: Pythonでsetオブジェクトを定義し、それらがサポートする操作を見つける方法を説明します。 リストとディクショナリに関する以前のチュートリアルと同様に、このチュートリアルを終了すると、セットが適切な選択であるタイミングを十分に把握できます。 また、frozen setsについても学習します。これは、1つの重要な詳細を除いて、セットに似ています。

__ Take the Quiz:インタラクティブな「Pythonセット」クイズで知識をテストします。 完了すると、学習の進捗状況を経時的に追跡できるようにスコアを受け取ります。

セットの定義

Pythonの組み込みsetタイプには、次の特徴があります。

  • セットは順不同です。

  • セット要素は一意です。 重複する要素は許可されていません。

  • セット自体は変更できますが、セットに含まれる要素は不変型でなければなりません。

それが何を意味するのか、そしてPythonでセットを操作する方法を見てみましょう。

セットは2つの方法で作成できます。 まず、組み込みのset()関数を使用してセットを定義できます。

x = set()

この場合、引数<iter>は反復可能であり、ここでも、今のところ、リストまたはタプルを考えて、セットに含まれるオブジェクトのリストを生成します。 これは、.extend()リストメソッドに指定された<iter>引数に類似しています。

>>>

>>> x = set(['foo', 'bar', 'baz', 'foo', 'qux'])
>>> x
{'qux', 'foo', 'bar', 'baz'}

>>> x = set(('foo', 'bar', 'baz', 'foo', 'qux'))
>>> x
{'qux', 'foo', 'bar', 'baz'}

文字列も反復可能であるため、文字列をset()に渡すこともできます。 list(s)が文字列sの文字のリストを生成することはすでに見てきました。 同様に、set(s)sの文字のセットを生成します。

>>>

>>> s = 'quux'

>>> list(s)
['q', 'u', 'u', 'x']
>>> set(s)
{'x', 'u', 'q'}

結果のセットは順序付けられていないことがわかります。定義で指定されている元の順序は、必ずしも保持されません。 さらに、最初の2つの例の文字列'foo'と3番目の例の文字'u'のように、重複する値はセット内で1回だけ表されます。

または、中括弧({})を使用してセットを定義することもできます。

x = {, , ..., }

セットがこのように定義されている場合、各<obj>は、反復可能であっても、セットの個別の要素になります。 この動作は、.append()リストメソッドの動作と似ています。

したがって、上記のセットも次のように定義できます。

>>>

>>> x = {'foo', 'bar', 'baz', 'foo', 'qux'}
>>> x
{'qux', 'foo', 'bar', 'baz'}

>>> x = {'q', 'u', 'u', 'x'}
>>> x
{'x', 'q', 'u'}

要点をまとめると:

  • set()への引数は反復可能です。 セットに配置される要素のリストを生成します。

  • 中かっこ内のオブジェクトは、反復可能であってもそのままセットに配置されます。

これらの2つのセット定義の違いを確認してください。

>>>

>>> {'foo'}
{'foo'}

>>> set('foo')
{'o', 'f'}

セットは空にすることができます。 ただし、Pythonは空の中括弧({})を空の辞書として解釈するため、空のセットを定義する唯一の方法はset()関数を使用することです。

>>>

>>> x = set()
>>> type(x)

>>> x
set()

>>> x = {}
>>> type(x)

空のセットはブールコンテキストでは偽です:

>>>

>>> x = set()
>>> bool(x)
False
>>> x or 1
1
>>> x and 1
set()

最も直感的なセットには同様のオブジェクトが含まれていると考えるかもしれません。たとえば、偶数や姓:

>>>

>>> s1 = {2, 4, 6, 8, 10}
>>> s2 = {'Smith', 'McArthur', 'Wilson', 'Johansson'}

ただし、Pythonはこれを必要としません。 セット内の要素は、さまざまなタイプのオブジェクトにすることができます。

>>>

>>> x = {42, 'foo', 3.14159, None}
>>> x
{None, 'foo', 42, 3.14159}

セット要素は不変でなければならないことを忘れないでください。 たとえば、タプルをセットに含めることができます。

>>>

>>> x = {42, 'foo', (1, 2, 3), 3.14159}
>>> x
{42, 'foo', 3.14159, (1, 2, 3)}

ただし、リストと辞書は変更可能であるため、要素を設定することはできません。

>>>

>>> a = [1, 2, 3]
>>> {a}
Traceback (most recent call last):
  File "", line 1, in 
    {a}
TypeError: unhashable type: 'list'

>>> d = {'a': 1, 'b': 2}
>>> {d}
Traceback (most recent call last):
  File "", line 1, in 
    {d}
TypeError: unhashable type: 'dict'

サイズとメンバーシップを設定する

len()関数はセット内の要素の数を返し、inおよびnot in演算子を使用してメンバーシップをテストできます。

>>>

>>> x = {'foo', 'bar', 'baz'}

>>> len(x)
3

>>> 'bar' in x
True
>>> 'qux' in x
False

セットでの操作

Pythonの他の複合データ型に使用できる操作の多くは、セットには意味がありません。 たとえば、セットをインデックス化またはスライスすることはできません。 ただし、Pythonは、数学的なセットに対して定義されているoperationsを一般的に模倣する、セットオブジェクトに対する多数の操作を提供します。

演算子対 方法

すべてではありませんが、ほとんどのPythonの集合演算は、演算子またはメソッドの2つの異なる方法で実行できます。 例として集合和を使用して、これらの演算子とメソッドがどのように機能するかを見てみましょう。

x1x2の2つのセットが与えられた場合、x1x2の和集合は、いずれかのセットのすべての要素で構成されるセットです。

次の2つのセットを検討してください。

x1 = {'foo', 'bar', 'baz'}
x2 = {'baz', 'qux', 'quux'}

x1x2の和集合は{'foo', 'bar', 'baz', 'qux', 'quux'}です。

Note:x1x2の両方に表示される要素'baz'は、ユニオンに1回だけ表示されることに注意してください。 セットに重複した値が含まれることはありません。

Pythonでは、集合和集合は|演算子を使用して実行できます。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'baz', 'qux', 'quux'}
>>> x1 | x2
{'baz', 'quux', 'qux', 'bar', 'foo'}

セット和集合は、.union()メソッドを使用して取得することもできます。 メソッドはセットの1つで呼び出され、もう1つは引数として渡されます。

>>>

>>> x1.union(x2)
{'baz', 'quux', 'qux', 'bar', 'foo'}

上記の例で使用されている方法、演算子とメソッドは同じように動作します。 しかし、それらの間には微妙な違いがあります。 |演算子を使用する場合は、両方のオペランドを設定する必要があります。 一方、.union()メソッドは、イテラブルを引数として取り、それをセットに変換してから、和集合を実行します。

次の2つのステートメントの違いを確認してください。

>>>

>>> x1 | ('baz', 'qux', 'quux')
Traceback (most recent call last):
  File "", line 1, in 
    x1 | ('baz', 'qux', 'quux')
TypeError: unsupported operand type(s) for |: 'set' and 'tuple'

>>> x1.union(('baz', 'qux', 'quux'))
{'baz', 'quux', 'qux', 'bar', 'foo'}

どちらもx1とタプル('baz', 'qux', 'quux')の和集合を計算しようとします。 これは|演算子では失敗しますが、.union()メソッドでは成功します。

利用可能な演算子とメソッド

以下は、Pythonで使用可能な集合演算のリストです。 オペレータによって実行されるもの、メソッドによって実行されるもの、および両方によって実行されるものがあります。 上記で概説した原則は一般に適用されます。セットが期待される場合、メソッドは通常、引数として反復可能なものを受け入れますが、演算子はオペランドとして実際のセットを必要とします。

x1.union(x2[, x3 ...])

x1 | x2 [| x3 ...]

2つ以上のセットの和集合を計算します。

x1.union(x2)x1 | x2はどちらも、x1またはx2のいずれかのすべての要素のセットを返します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'baz', 'qux', 'quux'}

>>> x1.union(x2)
{'foo', 'qux', 'quux', 'baz', 'bar'}

>>> x1 | x2
{'foo', 'qux', 'quux', 'baz', 'bar'}

演算子またはメソッドを使用して、3つ以上のセットを指定できます。

>>>

>>> a = {1, 2, 3, 4}
>>> b = {2, 3, 4, 5}
>>> c = {3, 4, 5, 6}
>>> d = {4, 5, 6, 7}

>>> a.union(b, c, d)
{1, 2, 3, 4, 5, 6, 7}

>>> a | b | c | d
{1, 2, 3, 4, 5, 6, 7}

結果のセットには、指定されたセットのいずれかに存在するすべての要素が含まれます。

x1.intersection(x2[, x3 ...])

x1 & x2 [& x3 ...]

2つ以上のセットの共通部分を計算します。

x1.intersection(x2)x1 & x2は、x1x2の両方に共通の要素のセットを返します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'baz', 'qux', 'quux'}

>>> x1.intersection(x2)
{'baz'}

>>> x1 & x2
{'baz'}

set unionと同様に、intersectionメソッドと演算子で複数のセットを指定できます。

>>>

>>> a = {1, 2, 3, 4}
>>> b = {2, 3, 4, 5}
>>> c = {3, 4, 5, 6}
>>> d = {4, 5, 6, 7}

>>> a.intersection(b, c, d)
{4}

>>> a & b & c & d
{4}

結果のセットには、指定されたすべてのセットに存在する要素のみが含まれます。

x1.difference(x2[, x3 ...])

x1 - x2 [- x3 ...]

2つ以上のセットの差を計算します。

x1.difference(x2)およびx1 - x2は、x1にはあるが、x2にはないすべての要素のセットを返します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'baz', 'qux', 'quux'}

>>> x1.difference(x2)
{'foo', 'bar'}

>>> x1 - x2
{'foo', 'bar'}

これを考える別の方法は、x1.difference(x2)x1 - x2が、x2の要素がx1から削除または減算されたときに生じるセットを返すことです。

ここでも、3つ以上のセットを指定できます。

>>>

>>> a = {1, 2, 3, 30, 300}
>>> b = {10, 20, 30, 40}
>>> c = {100, 200, 300, 400}

>>> a.difference(b, c)
{1, 2, 3}

>>> a - b - c
{1, 2, 3}

複数のセットが指定されている場合、操作は左から右に実行されます。 上記の例では、a - bが最初に計算され、結果として{1, 2, 3, 300}になります。 次に、cがそのセットから減算され、{1, 2, 3}が残ります。

set difference

x1.symmetric_difference(x2)

x1 ^ x2 [^ x3 ...]

セット間のsymmetric differenceを計算します。

x1.symmetric_difference(x2)x1 ^ x2は、x1またはx2のいずれかで、両方ではなく、すべての要素のセットを返します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'baz', 'qux', 'quux'}

>>> x1.symmetric_difference(x2)
{'foo', 'qux', 'quux', 'bar'}

>>> x1 ^ x2
{'foo', 'qux', 'quux', 'bar'}

^演算子では、3つ以上のセットも使用できます。

>>>

>>> a = {1, 2, 3, 4, 5}
>>> b = {10, 2, 3, 4, 50}
>>> c = {1, 50, 100}

>>> a ^ b ^ c
{100, 5, 10}

差分演算子と同様に、複数のセットが指定されている場合、操作は左から右に実行されます。

不思議なことに、^演算子は複数のセットを許可しますが、.symmetric_difference()メソッドは次のことを許可しません。

>>>

>>> a = {1, 2, 3, 4, 5}
>>> b = {10, 2, 3, 4, 50}
>>> c = {1, 50, 100}

>>> a.symmetric_difference(b, c)
Traceback (most recent call last):
  File "", line 1, in 
    a.symmetric_difference(b, c)
TypeError: symmetric_difference() takes exactly one argument (2 given)

x1.isdisjoint(x2)

2つのセットに共通の要素があるかどうかを決定します。

x1x2に共通の要素がない場合、x1.isdisjoint(x2)Trueを返します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'baz', 'qux', 'quux'}

>>> x1.isdisjoint(x2)
False

>>> x2 - {'baz'}
{'quux', 'qux'}
>>> x1.isdisjoint(x2 - {'baz'})
True

x1.isdisjoint(x2)Trueの場合、x1 & x2は空のセットです。

>>>

>>> x1 = {1, 3, 5}
>>> x2 = {2, 4, 6}

>>> x1.isdisjoint(x2)
True
>>> x1 & x2
set()

Note:.isdisjoint()メソッドに対応する演算子はありません。

x1.issubset(x2)

x1 <= x2

1つのセットが他のセットのサブセットであるかどうかを判別します。

集合論では、x1のすべての要素がx2にある場合、集合x1は別の集合x2のサブセットと見なされます。

x1x2のサブセットである場合、x1.issubset(x2)およびx1 <= x2Trueを返します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x1.issubset({'foo', 'bar', 'baz', 'qux', 'quux'})
True

>>> x2 = {'baz', 'qux', 'quux'}
>>> x1 <= x2
False

セットはそれ自体のサブセットと見なされます。

>>>

>>> x = {1, 2, 3, 4, 5}
>>> x.issubset(x)
True
>>> x <= x
True

おそらく奇妙に思えます。 しかし、それは定義に適合します—xのすべての要素はxにあります。

x1 < x2

1つのセットが他のセットの適切なサブセットであるかどうかを判別します。

適切なサブセットはサブセットと同じですが、セットを同一にすることはできません。 x1のすべての要素がx2にあり、x1x2が含まれている場合、セットx1は別のセットx2の適切なサブセットと見なされます。等しくない。

x1x2の適切なサブセットである場合、x1 < x2Trueを返します。

>>>

>>> x1 = {'foo', 'bar'}
>>> x2 = {'foo', 'bar', 'baz'}
>>> x1 < x2
True

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'foo', 'bar', 'baz'}
>>> x1 < x2
False

セットはそれ自体のサブセットと見なされますが、それ自体の適切なサブセットではありません。

>>>

>>> x = {1, 2, 3, 4, 5}
>>> x <= x
True
>>> x < x
False

Note:<演算子は、集合が適切なサブセットかどうかをテストする唯一の方法である。 対応する方法はありません。

x1.issuperset(x2)

x1 >= x2

1つのセットが他のセットのスーパーセットであるかどうかを判別します。

スーパーセットは、サブセットの逆です。 x1x2のすべての要素が含まれている場合、セットx1は別のセットx2のスーパーセットと見なされます。

x1x2のスーパーセットである場合、x1.issuperset(x2)およびx1 >= x2Trueを返します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}

>>> x1.issuperset({'foo', 'bar'})
True

>>> x2 = {'baz', 'qux', 'quux'}
>>> x1 >= x2
False

セットはそれ自体のサブセットと見なされることを既に見ました。 セットは、それ自体のスーパーセットとも見なされます。

>>>

>>> x = {1, 2, 3, 4, 5}
>>> x.issuperset(x)
True
>>> x >= x
True

x1 > x2

1つのセットが他のセットの適切なスーパーセットであるかどうかを判別します。

適切なスーパーセットはスーパーセットと同じですが、セットを同一にすることはできません。 x1x2のすべての要素が含まれ、x1x2が含まれていない場合、セットx1は別のセットx2の適切なスーパーセットと見なされます等しい。

x1x2の適切なスーパーセットである場合、x1 > x2Trueを返します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'foo', 'bar'}
>>> x1 > x2
True

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'foo', 'bar', 'baz'}
>>> x1 > x2
False

セットはそれ自体の適切なスーパーセットではありません。

>>>

>>> x = {1, 2, 3, 4, 5}
>>> x > x
False

(t0)s>演算子は、集合が適切なスーパーセットかどうかをテストする唯一の方法である。 対応する方法はありません。

セットの変更

セットに含まれる要素は不変型でなければなりませんが、セット自体は変更できます。 上記の操作と同様に、セットの内容を変更するために使用できる演算子とメソッドが混在しています。

拡張割り当て演算子とメソッド

上記の共用体、交差、差、および対称差演算子のそれぞれには、セットを変更するために使用できる拡張割り当て形式があります。 それぞれに対応する方法もあります。

x1.update(x2[, x3 ...])

x1 |= x2 [| x3 ...]

集合ごとにセットを変更します。

x1.update(x2)およびx1 |= x2は、x1にまだないx2内の要素をx1に追加します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'foo', 'baz', 'qux'}

>>> x1 |= x2
>>> x1
{'qux', 'foo', 'bar', 'baz'}

>>> x1.update(['corge', 'garply'])
>>> x1
{'qux', 'corge', 'garply', 'foo', 'bar', 'baz'}

x1.intersection_update(x2[, x3 ...])

x1 &= x2 [& x3 ...]

交差によってセットを変更します。

x1.intersection_update(x2)x1 &= x2x1を更新し、x1x2の両方で見つかった要素のみを保持します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'foo', 'baz', 'qux'}

>>> x1 &= x2
>>> x1
{'foo', 'baz'}

>>> x1.intersection_update(['baz', 'qux'])
>>> x1
{'baz'}

x1.difference_update(x2[, x3 ...])

x1 -= x2 [| x3 ...]

違いによってセットを変更します。

x1.difference_update(x2)およびx1 -= x2x1を更新し、x2で見つかった要素を削除します。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'foo', 'baz', 'qux'}

>>> x1 -= x2
>>> x1
{'bar'}

>>> x1.difference_update(['foo', 'bar', 'qux'])
>>> x1
set()

x1.symmetric_difference_update(x2)

x1 ^= x2

対称差によりセットを変更します。

x1.symmetric_difference_update(x2)x1 ^= x2x1を更新し、x1またはx2のいずれかで見つかった要素を保持しますが、両方ではありません。

>>>

>>> x1 = {'foo', 'bar', 'baz'}
>>> x2 = {'foo', 'baz', 'qux'}
>>>
>>> x1 ^= x2
>>> x1
{'bar', 'qux'}
>>>
>>> x1.symmetric_difference_update(['qux', 'corge'])
>>> x1
{'bar', 'corge'}

セットを変更する他の方法

上記の拡張演算子とは別に、Pythonはセットを変更するいくつかの追加メソッドをサポートしています。

x.add()

セットに要素を追加します。

x.add(<elem>)は、単一の不変オブジェクトでなければならない<elem>xに追加します。

>>>

>>> x = {'foo', 'bar', 'baz'}

>>> x.add('qux')
>>> x
{'bar', 'baz', 'foo', 'qux'}

x.remove()

セットから要素を削除します。

x.remove(<elem>)は、xから<elem>を削除します。 <elem>xにない場合、Pythonは例外を発生させます。

>>>

>>> x = {'foo', 'bar', 'baz'}

>>> x.remove('baz')
>>> x
{'bar', 'foo'}

>>> x.remove('qux')
Traceback (most recent call last):
  File "", line 1, in 
    x.remove('qux')
KeyError: 'qux'

x.discard()

セットから要素を削除します。

x.discard(<elem>)は、xから<elem>も削除します。 ただし、<elem>xにない場合、このメソッドは例外を発生させる代わりに静かに何もしません。

>>>

>>> x = {'foo', 'bar', 'baz'}

>>> x.discard('baz')
>>> x
{'bar', 'foo'}

>>> x.discard('qux')
>>> x
{'bar', 'foo'}

x.pop()

セットからランダムな要素を削除します。

x.pop()は、任意に選択された要素をxから削除して返します。 xが空の場合、x.pop()は例外を発生させます。

>>>

>>> x = {'foo', 'bar', 'baz'}

>>> x.pop()
'bar'
>>> x
{'baz', 'foo'}

>>> x.pop()
'baz'
>>> x
{'foo'}

>>> x.pop()
'foo'
>>> x
set()

>>> x.pop()
Traceback (most recent call last):
  File "", line 1, in 
    x.pop()
KeyError: 'pop from an empty set'

x.clear()

セットをクリアします。

x.clear()は、xからすべての要素を削除します。

>>>

>>> x = {'foo', 'bar', 'baz'}
>>> x
{'foo', 'bar', 'baz'}
>>>
>>> x.clear()
>>> x
set()

冷凍セット

Pythonは、frozensetと呼ばれる別の組み込み型を提供します。これは、frozensetが不変であることを除いて、すべての点でセットとまったく同じです。 frozensetで非変更操作を実行できます。

>>>

>>> x = frozenset(['foo', 'bar', 'baz'])
>>> x
frozenset({'foo', 'baz', 'bar'})

>>> len(x)
3

>>> x & {'baz', 'qux', 'quux'}
frozenset({'baz'})

ただし、frozensetを変更しようとするメソッドは失敗します。

>>>

>>> x = frozenset(['foo', 'bar', 'baz'])

>>> x.add('qux')
Traceback (most recent call last):
  File "", line 1, in 
    x.add('qux')
AttributeError: 'frozenset' object has no attribute 'add'

>>> x.pop()
Traceback (most recent call last):
  File "", line 1, in 
    x.pop()
AttributeError: 'frozenset' object has no attribute 'pop'

>>> x.clear()
Traceback (most recent call last):
  File "", line 1, in 
    x.clear()
AttributeError: 'frozenset' object has no attribute 'clear'

>>> x
frozenset({'foo', 'bar', 'baz'})

ディープダイブ:凍結セットと拡張割り当て

frozensetは不変であるため、拡張代入演算子のターゲットにできないと考えるかもしれません。 ただし、次の点に注意してください。

>>>

>>> f = frozenset(['foo', 'bar', 'baz'])
>>> s = {'baz', 'qux', 'quux'}

>>> f &= s
>>> f
frozenset({'baz'})

何ができる?

Pythonは、所定の場所にあるfrozensetに対して拡張割り当てを実行しません。 ステートメントx &= sは、実質的にx = x & sと同等です。 元のxを変更していません。 xを新しいオブジェクトに再割り当てし、最初に参照されていたオブジェクトxはなくなります。

これは、id()関数で確認できます。

>>>

>>> f = frozenset(['foo', 'bar', 'baz'])
>>> id(f)
56992872
>>> s = {'baz', 'qux', 'quux'}

>>> f &= s
>>> f
frozenset({'baz'})
>>> id(f)
56992152

fは、拡張された割り当ての後に異なる整数識別子を持っています。 その場所は変更されておらず、再割り当てされています。

Pythonの一部のオブジェクトは、拡張代入演算子のターゲットである場合、その場で変更されます。 しかし、frozensetsはそうではありません。

凍結セットは、セットを使用したいが、不変オブジェクトが必要な状況で役立ちます。 たとえば、セット要素は不変でなければならないため、要素もセットであるセットを定義することはできません。

>>>

>>> x1 = set(['foo'])
>>> x2 = set(['bar'])
>>> x3 = set(['baz'])
>>> x = {x1, x2, x3}
Traceback (most recent call last):
  File "", line 1, in 
    x = {x1, x2, x3}
TypeError: unhashable type: 'set'

セットのセットを定義することを本当に強いられていると感じた場合(そうなる可能性があります)、要素が不変であるため、要素がfrozensetである場合、それを行うことができます。

>>>

>>> x1 = frozenset(['foo'])
>>> x2 = frozenset(['bar'])
>>> x3 = frozenset(['baz'])
>>> x = {x1, x2, x3}
>>> x
{frozenset({'bar'}), frozenset({'baz'}), frozenset({'foo'})}

同様に、dictionariesに関する前のチュートリアルから、辞書キーは不変でなければならないことを思い出してください。 組み込みのセットタイプを辞書キーとして使用することはできません。

>>>

>>> x = {1, 2, 3}
>>> y = {'a', 'b', 'c'}
>>>
>>> d = {x: 'foo', y: 'bar'}
Traceback (most recent call last):
  File "", line 1, in 
    d = {x: 'foo', y: 'bar'}
TypeError: unhashable type: 'set'

セットを辞書キーとして使用する必要がある場合は、frozensetsを使用できます。

>>>

>>> x = frozenset({1, 2, 3})
>>> y = frozenset({'a', 'b', 'c'})
>>>
>>> d = {x: 'foo', y: 'bar'}
>>> d
{frozenset({1, 2, 3}): 'foo', frozenset({'c', 'a', 'b'}): 'bar'}

結論

このチュートリアルでは、Pythonでsetオブジェクトを定義する方法を学び、セットの操作に使用できる関数、演算子、およびメソッドについて理解しました。

これで、Pythonが提供する基本的な組み込みデータ型に慣れるはずです。

次に、これらのオブジェクトで動作するコードが、Pythonプログラムでどのように編成および構造化されているかを探り始めます。

__ Take the Quiz:インタラクティブな「Pythonセット」クイズで知識をテストします。 完了すると、学習の進捗状況を経時的に追跡できるようにスコアを受け取ります。