获取一组集合的交集

15

我希望使用Python获取一组集合的交集。

例如,我有一个返回一个列表的集合s的函数:

[set(0,1,3), set(1,3)]

你可以看到,它们的交集是集合{1,3}。我该如何用Python获取这个交集?迄今为止,我一直在遍历列表。但我似乎无法获得交集。

解决方案应该能够处理由n个元素组成的集合列表而不仅仅是一对。

有什么想法吗?

欢迎使用推导式。

另外,为什么在其他情况下将集合呈现为set([]),也就是说,为什么不只用大括号呢?


7
那不是“联合”,那是集合的“交集”。联合将会是 {0, 1, 3} - Martijn Pieters
1
花括号语法是后来添加到该语言中的。 - Martijn Pieters
2
@MartijnPieters 真是个尴尬的低级失误。谢谢。 - franklin
1
{} 是一个空字典的字面量,而不是一个空集合的字面量。 - chepner
2个回答

31

使用 set.intersection

>>> lis = [set((0,1,3)), set((1,3))]
>>> set.intersection(*lis)
set([1, 3])

使用set.union进行并集操作:

>>> set.union(*lis)
set([0, 1, 3])

如果注重性能,那么请使用这个:

>>> from itertools import islice
>>> set.intersection(set(lis[0]), *islice(lis, 1, None))
set([1, 3])

我删掉了我的回答,因为你把 set.union 的答案加到了你的回答里。不错。 :) - Sukrit Kalra
通配符有什么作用的任何文档? - franklin
@franklin http://docs.python.org/2/tutorial/controlflow.html#tut-unpacking-arguments(请注意,这是一个网址链接,不是文本内容的翻译) - Ashwini Chaudhary
2
如果你的列表为空,这将会生成一个错误。 建议: "set.intersection(*lis) if lis else set()" 或者: "set.union(*lis) if lis else set()" - EMS
  • 在它前面是做什么用的?
- O.rka
@O.rka 在函数调用中的 * 表示解包可迭代对象的参数,并将它们作为单独的参数传递给函数,因此 set.intersection(*lis) 等同于 set.intersection(set((0,1,3)), set((1,3))) - Ashwini Chaudhary

2

试试这个:

reduce(set.intersection, L)

In [83]: L = [set([0,1,3]), set([1,3])]

In [84]: reduce(set.intersection, L)
Out[84]: set([1, 3])

L 没有元素时,这也会失败。 - EoghanM

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