找到多个集合交集的最佳方法?

2025-01-17 09:23:00
admin
原创
119
摘要:问题描述:我有一组列表:setlist = [s1,s2,s3...] 我想要 s1∩s2∩s3...我可以编写一个函数来完成一系列成对s1.intersection(s2)等操作。有没有推荐的、更好的或内置的方法?解决方案 1:从 Python 2.6 版开始,你可以使用多个参数set.intersecti...

问题描述:

我有一组列表:

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,但我有点喜欢它:)

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2500  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1541  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   16  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   23  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   26  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用