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

时间:2013-10-25 04:09:08

标签: python set union intersection

我正在用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])

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

>> 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 个答案:

答案 0 :(得分:79)

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

答案 1 :(得分:13)

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

答案 2 :(得分: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 :(得分:1)

[删除了错误答案]

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

例如:

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