Python set Union 和 set Intersection 的操作方式不同?

Posted

技术标签:

【中文标题】Python set Union 和 set Intersection 的操作方式不同?【英文标题】:Python set Union and set Intersection operate differently? 【发布时间】:2013-11-04 01:07:02 【问题描述】:

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

【问题讨论】:

【参考方案1】:

[删除错误答案]

正如@Anto Vinish 建议的那样,您应该首先将列表转换为集合,然后使用 set.intersection

例如:

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

【讨论】:

如何以与合并多个集合类似的方式相交多个集合? @Hypuk 如果答案不正确,您可以将其删除(如果您愿意)【参考方案2】:

将列表转换为先设置

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

【讨论】:

set.intersection 不同于 set().intersection 它确实实现了我正在寻找的输出【参考方案3】:
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]]))

【讨论】:

【参考方案4】:

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

如果你真的有一个集合的列表,你可以得到它们的交集,就像你做的那样。

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

但是,您不能以您的方式直接执行此操作,因为在您使用intersection(*...) 的示例中实际上根本没有任何集合。你只有一个 lists 的列表。您应该首先将列表中的元素转换为集合。所以如果你有

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

你应该这样做

x = [set(a) for a in x]

【讨论】:

以上是关于Python set Union 和 set Intersection 的操作方式不同?的主要内容,如果未能解决你的问题,请参考以下文章

python Python:set.union(),issuperset()

set_difference、set_intersection 和 set_union 的就地版本

python之集合操作

python 类型之 set

Python set

Python的set集合详解