找到多个集合交集的最佳方法?
- 2025-01-17 09:23:00
- admin 原创
- 9
问题描述:
我有一组列表:
setlist = [s1,s2,s3...]
我想要 s1∩s2∩s3...
我可以编写一个函数来完成一系列成对s1.intersection(s2)
等操作。
有没有推荐的、更好的或内置的方法?
解决方案 1:
从 Python 2.6 版开始,你可以使用多个参数set.intersection()
,例如
u = set.intersection(s1, s2, s3)
如果集合在列表中,则转换为:
u = set.intersection(*setlist)
列表扩展*a_list
在哪里
请注意,这set.intersection
不是静态方法,但它使用函数符号来将第一个集合与列表的其余部分进行交集。因此,如果参数列表为空,则此方法将失败。
解决方案 2:
从 2.6 开始,set.intersection
可以任意获取多个可迭代对象。
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s3 = set([2, 4, 6])
>>> s1 & s2 & s3
set([2])
>>> s1.intersection(s2, s3)
set([2])
>>> sets = [s1, s2, s3]
>>> set.intersection(*sets)
set([2])
解决方案 3:
显然set.intersection
这是您想要的,但是如果您需要“对所有这些求和”、“对所有这些求乘积”、“对所有这些求异或”的概括,您要寻找的是函数reduce
:
from operator import and_
from functools import reduce
print(reduce(and_, [{1,2,3},{2,3,4},{3,4,5}])) # = {3}
或者
print(reduce((lambda x,y: x&y), [{1,2,3},{2,3,4},{3,4,5}])) # = {3}
解决方案 4:
如果你没有 Python 2.6 或更高版本,那么另一种方法是编写显式的 for 循环:
def set_list_intersection(set_list):
if not set_list:
return set()
result = set_list[0]
for s in set_list[1:]:
result &= s
return result
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print set_list_intersection(set_list)
# Output: set([1])
您还可以使用reduce
:
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print reduce(lambda s1, s2: s1 & s2, set_list)
# Output: set([1])
然而很多 Python 程序员并不喜欢它,包括 Guido 自己:
大约 12 年前,Python 获得了 lambda、reduce()、filter() 和 map(),这要归功于(我相信)一位 Lisp 黑客,他错过了这些功能并提交了可用的补丁。但是,尽管 PR 值很高,我认为这些功能应该从 Python 3000 中删除。
现在来看看reduce()。这实际上是我最讨厌的,因为除了涉及+或*的几个例子外,几乎每次我看到reduce()调用带有非平凡函数参数时,我都需要拿起笔和纸来绘制实际输入到该函数的内容,然后才能理解reduce()应该做什么。所以在我看来,reduce()的适用性几乎仅限于结合运算符,在所有其他情况下,最好明确写出累积循环。
解决方案 5:
我认为最简单的做法是:
#assuming three sets
set1 = {1,2,3,4,5}
set2 = {2,3,8,9}
set3 = {2,10,11,12}
#intersection
set4 = set1 & set2 & set3
set4 将是 set1、set2、set3 的交集,且包含值 2。
print(set4)
set([2])
解决方案 6:
Jean-François Fabre set.intesection(*list_of_sets) 答案绝对是最具 Pyhtonic 的,并且是正确接受的答案。
对于那些想要使用reduce的人来说,下面的方法也可以起作用:
reduce(set.intersection, list_of_sets)
解决方案 7:
在这里,我提供了一个用于多集合交集的通用函数,试图利用可用的最佳方法:
def multiple_set_intersection(*sets):
"""Return multiple set intersection."""
try:
return set.intersection(*sets)
except TypeError: # this is Python < 2.6 or no arguments
pass
try: a_set= sets[0]
except IndexError: # no arguments
return set() # return empty set
return reduce(a_set.intersection, sets[1:])
Guido 可能不喜欢reduce
,但我有点喜欢它:)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)