46

私はPythonでいくつかのセット操作を行っていますが、奇妙なことに気づきました..

>> set([1,2,3]) | set([2,3,4])
set([1, 2, 3, 4])
>> set().union(*[[1,2,3], [2,3,4]])
set([1, 2, 3, 4])

それは良い、予想される動作ですが、交差があります:

>> set([1,2,3]) & set([2,3,4])
set([2, 3])
>> set().intersection(*[[1,2,3], [2,3,4]])
set([])

私はここで気が狂っていますか?set.intersection() が期待どおりに動作しないのはなぜですか?

ユニオンで行ったように、多くのセットの交差を行うにはどうすればよいですか ([[1,2,3], [2,3,4]]リストがさらにたくさんあると仮定して)。「pythonic」の方法は何でしょうか?

4

4 に答える 4

85

あなたがそうするとき、あなたはset()空のセットを作成しています。あなたがそうするとき、あなたset().intersection(...)はこの空のセットを他のものと交差させています。空のセットと他のセットのコレクションとの共通部分は空です。

実際にsetsのリストがある場合は、その方法と同様にそれらの交差を取得できます。

>>> x = [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}]
>>> set.intersection(*x)
set([3])

ただし、実際にはintersection(*...). リストのリストがあるだけです。最初にリスト内の要素をセットに変換する必要があります。だからあなたが持っているなら

x = [[1,2,3], [2,3,4]]

やったほうがいい

x = [set(a) for a in x]
于 2013-10-25T04:12:15.113 に答える
14
set().intersection(*[[1,2,3], [2,3,4]])

空のセットから始めて他のすべてのセットと交差するため、もちろん空です

でメソッドを呼び出すことができますclass

set.intersection(*[[1,2,3], [2,3,4]])

ただし、渡される最初の引数はセットである必要があるため、これは機能しません

set.intersection({1, 2, 3}, *[[2,3,4], ...])

これは厄介に見えますが、最初からセットのリストを使用できた方がよいでしょう。特に、最初のアイテムをきれいに引き離すのが難しいジェネレーターからのものである場合

set.intersection(*[{1,2,3}, {2,3,4}])

それ以外の場合は、それらをすべてセットにすることができます

set.intersection(*(set(x) for x in [[1,2,3], [2,3,4]]))
于 2013-10-25T04:23:34.830 に答える
10

リストを最初に設定するように変換します

>>> set.intersection(*[set([1,2,3]), set([2,3,4])])
set([2, 3])

使用できる複数のリストの場合、

>>> set.intersection(*[set([1,2,3]), set([2,3,4]), set([5,3,4])])
set([3])
于 2013-10-25T04:16:19.697 に答える
1

【不正解を削除しました】

@Anto Vinishが提案したように、最初にリストをセットに変換してから set.intersection を使用する必要があります

例えば:

>>> sets = [set([1, 2, 3]), set([2, 3, 4]), set([3, 4, 5])]
>>> set.intersection(*sets)
set([3])
于 2013-10-25T04:12:53.420 に答える