1. ホーム
  2. python

[解決済み] Python set から set を取り除く

2023-05-21 19:18:26

質問

Python 2.7.2 のドキュメントの解釈によると 組み込みの型 5.7 セット型 に渡すことで、集合Aの要素を集合Bから取り除くことができるはずです。 set.remove(elem) または set.discard(elem)

2.7.2 のドキュメントより。

の elem 引数は __contains__() , remove() そして discard() メソッドはセットであってもよい。

を渡せるということだと解釈しています。 setremove(elem) または discard(elem) といった具合で、それらの要素がターゲットセットから削除されます。私はこれを使って、文字列からすべての母音を削除したり 単語頻度ヒストグラムからすべての共通単語を削除する . 以下はテストコードです。

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [M...
Type "help", "copyright", "credits" or "license"
>>> a = set(range(10))
>>> b = set(range(5,10))
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
set([8, 9, 5, 6, 7])
>>> a.remove(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: set([8, 9, 5, 6, 7])
>>> a.discard(b)
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>

どれが返ってくるか期待する。

>>> a
set([0, 1, 2, 3, 4])

で実現できることは分かっています。 a.difference(b) で、これは新しいセットを返します。 set.difference_update(other) を使うか、集合演算子 a -= b で、これはセットをその場で変更します。

ということは、これはドキュメントのバグなのでしょうか?できること set.remove(elem) は実際には引数としてセットを取らないのでしょうか?それとも、ドキュメントでは集合の集合を参照しているのでしょうか?ということは difference_update が私の解釈を実現していることから、私は後者のケースだと推測しています。

十分不明瞭ですか?

EDIT 3年間の追加の(いくつかの専門的な)pythonの仕事の後、そして最近この質問に引き戻され、私は今、私が実際にしようとしていたことは、で達成することができることを実現します。

>>> c = a.difference(b)
set([0,1,2,3,4])

というのは、もともと私が得ようとしていたものです。

EDIT その後 さらに4年 pythonの開発で... この操作はセットリテラルを使ってもっときれいに表現できることに気がつきました。 - 演算子を使ってよりきれいに表現できること、そして集合の違いが非可換であることを示すのがより完全であることを理解しています。

>>> a={0,1,2,3}
>>> b={2,3,4,5}
>>> a-b
set([0, 1])
>>> b-a
set([4, 5])

どのように解決するのですか?

すでに回答されていますね。集合の集合(実際にはフロジン集合を含む集合)を指します。

あなたが参照している段落 で始まっています。

<ブロッククオート

注意: __contains__(), remove(), discard() メソッドの elem 引数は集合であってもよい。

ということは ba.remove(b) はセットである可能性があり、その後に続く。

等価なフローゼンセットの検索をサポートするために をサポートするために、elem セットは検索中に一時的に変異され、その後復元されます。検索中、elemセットは意味のある値ではないので、読み込んだり、変異させたりしてはいけません。

ということは、もし b は集合です。 a.remove(b) をスキャンします。 a に相当するフロジンセットについて b を探し、それを削除する (あるいは KeyError を投げる)。