Pythonでセットのセットを作成するにはどうすればよいですか?


126

Pythonでセットのセットを作成しようとしています。どうすればいいのかわからない。

空のセットから始めますxx

xx = set([])
# Now we have some other set, for example
elements = set([2,3,4])
xx.add(elements)

しかし私は得る

TypeError: unhashable type: 'list'

または

TypeError: unhashable type: 'set'

Pythonでセットのセットを持つことは可能ですか?

私は大量のセットのコレクションを扱っており、重複セットを処理する必要がないようにしたい(A1 = A1のセットB、A。= Ajの場合、Anは2つのセットを「キャンセル」する)

回答:


120

内部setオブジェクトは変更可能であり、したがってハッシュ可能ではないため、Pythonの不満。解決策はfrozenset、内部セットを使用して、それらを変更する意図がないことを示すことです。


59

人々はすでにあなたがfrozenset()でこれを行うことができると述べたので、これを達成する方法をコードに追加します:

たとえば、次のリストのリストからセットのセットを作成するとします。

t = [[], [1, 2], [5], [1, 2, 5], [1, 2, 3, 4], [1, 2, 3, 6]]

次の方法でセットを作成できます。

t1 = set(frozenset(i) for i in t)

9
またはマップを使用できます!set(map(frozenset, t))
Matt Dodge

18

frozenset内部で使用します。


9
おそらく、彼が新しいので、Pythonの可変オブジェクトと不変オブジェクトについていくつかの指針を示すことができますか?
セスジョンソン

2
@Seth:できますが、可変性は要因ではありません。
Ignacio Vazquez-Abrams、

どうもありがとう!re:mutabilityを読んでください。リストのセットも機能するようですが、frozensetはそれを完了したようです。再度、感謝します!
マット

@Ignacio私は、セットのメンバーとディクテーションのキーはハッシュ可能でなければならず、したがって不変である必要があると思いました。
セスジョンソン、

7
ハッシュ可能性と可変性は必ずしも相互に排他的ではありません。ほとんどの基本的なPythonの型がパターンを共有するのは、たまたま起こります。
Ignacio Vazquez-Abrams、

3

だから私はまったく同じ問題を抱えていました。一連のセットとして機能するデータ構造を作成したかったのです。問題は、セットに不変オブジェクトが含まれている必要があることです。だから、あなたができることは単にそれをタプルのセットとして作ることです。これでうまくいきました。

A = set()
A.add( (2,3,4) )##adds the element
A.add( (2,3,4) )##does not add the same element
A.add( (2,3,5) )##adds the element, because it is different!

22
タプルでは、​​要素の順序が重要です。したがってA.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4))、元の質問があることを意味「セットのセット」についてであるが、三つの異なる要素が追加され(2,3,4)(4,3,2)(2,4,3)同一です。
ボリス・ゴレリク2017

1

2020年の時点で、公式のPythonドキュメントfrozensetは、セットのセットを表すためにを使用することを推奨しています。


1
うわーこれはPEP 416(冷凍辞書)が採用されなかったし、それが2012年に提案されたことを考えると非常に興味深いです
NikoNyrh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.