Python设置Union和设置Intersection的操作方式有何不同?

Bil*_*kil 47 python union intersection set

我正在用Python做一些set操作,我注意到有些奇怪的东西..

>> 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])
Run Code Online (Sandbox Code Playgroud)

那是好的,预期的行为 - 但是有了交集:

>> set([1,2,3]) & set([2,3,4])
set([2, 3])
>> set().intersection(*[[1,2,3], [2,3,4]])
set([])
Run Code Online (Sandbox Code Playgroud)

我在这里失去理智吗?为什么set.intersection()不像我期望的那样运行?

我怎么能像工作一样做多组的交集(假设[[1,2,3], [2,3,4]]有更多的列表)?"pythonic"的方式是什么?

Bre*_*arn 79

当你这样做时,set()你创建一个空集.当你这样做时,set().intersection(...)你将这个空集与其他东西相交.空集与任何其他集合集的交集为空.

如果你确实有一个集合列表,你可以得到他们的交集类似于你的方式.

>>> x = [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}]
>>> set.intersection(*x)
set([3])
Run Code Online (Sandbox Code Playgroud)

但是,你不能直接用你的方式做到这一点,因为你的例子中根本没有任何集合intersection(*...).你只有一个列表清单.您应该首先将列表中的元素转换为集合.所以,如果你有

x = [[1,2,3], [2,3,4]]
Run Code Online (Sandbox Code Playgroud)

你应该做

x = [set(a) for a in x]
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 13

set().intersection(*[[1,2,3], [2,3,4]])
Run Code Online (Sandbox Code Playgroud)

当然是空的,因为你从空集开始并与所有其他集相交

您可以尝试调用该方法 class

set.intersection(*[[1,2,3], [2,3,4]])
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为传递的第一个参数需要是一个集合

set.intersection({1, 2, 3}, *[[2,3,4], ...])
Run Code Online (Sandbox Code Playgroud)

如果您可以首先使用集合列表,这看起来很尴尬.特别是如果它们来自发电机,这使得难以干净地拉出第一个物品

set.intersection(*[{1,2,3}, {2,3,4}])
Run Code Online (Sandbox Code Playgroud)

否则你可以它们全部放进去

set.intersection(*(set(x) for x in [[1,2,3], [2,3,4]]))
Run Code Online (Sandbox Code Playgroud)


Ant*_*nto 10

将列表转换为先设置

>>> set.intersection(*[set([1,2,3]), set([2,3,4])])
set([2, 3])
Run Code Online (Sandbox Code Playgroud)

对于您可以使用的多个列表,

>>> set.intersection(*[set([1,2,3]), set([2,3,4]), set([5,3,4])])
set([3])
Run Code Online (Sandbox Code Playgroud)

  • `set.intersection`与`set().intersection`不同 (3认同)