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