Python集合的并集和交集操作有所不同?

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()的操作结果和我的预期不一样?

如果我想像使用union那样对多个集合求交集(假设[[1,2,3], [2,3,4]]有很多个列表),我该怎么做?用"Pythonic"的方式应该怎么做?

4个回答

85

当您执行set()时,您正在创建一个空集。 当您执行set().intersection(...)时,您正在将此空集与其他内容相交。 空集与任何其他集合的交集都是空集。

如果您实际上有一组集合的列表,可以通过类似于您所做的方式获得它们的交集。

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

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

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

3
set.intersectionset().intersection不同。 - roippi
然而,它确实实现了我所期望的输出。 - Bilal Akil

1
如@Anto Vinish所建议的,您应该先将列表转换为集合,然后使用set.intersection。
例如:
>>> sets = [set([1, 2, 3]), set([2, 3, 4]), set([3, 4, 5])]
>>> set.intersection(*sets)
set([3])

我该如何以类似于合并多个集合的方式交集多个集合? - Bilal Akil
3
如果回答不正确,您可以删除它(如果您愿意)。 - Grijesh Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接