Python设置Union和Set Intersection的操作有所不同吗?

我正在做一些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”的方式是什么?

当你做set()你正在创build一个空集。 当你做set().intersection(...)你将这个空集与其他东西相交。 空集与任何其他集的集合是空的。

如果你真的有一套清单,你​​可以得到他们的交集类似于你做的。

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

尽pipe如此,你不能直接用这种方式来做这件事,因为在你的例子中,你并没有任何intersection(*...) 。 你只是有一个列表。 您应该先将列表中的元素转换为集合。 所以,如果你有

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

你应该做

 x = [set(a) for a in x] 
 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]])) 

先转换列表设置

 >>> 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]) 

[删除不正确的答案]

作为@Anto Vinishbuild议你应该首先将列表转换为set,然后使用set.intersect。 例如:

 >>> sets = [set([1, 2, 3]), set([2, 3, 4]), set([3, 4, 5])] >>> set.intersection(*sets) set([3]) 
Interesting Posts