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