【问题标题】:Checking intersection of two sets by two values in each [duplicate]通过每个[重复]中的两个值检查两组的交集
【发布时间】:2018-04-25 15:01:16
【问题描述】:

我需要找出两个具有起始值和结束值的数组之间是否有任何交集(此https://en.wikipedia.org/wiki/Intersection_(set_theory) 上的wiki)。例如(只是少数情况):

a = (10, float("inf"))
b = (8, float("inf"))

a = (10, 20)
b = (4, 25)

所以,b 包含 a。我怎样才能在 python 中做到这一点?有什么工具可以做到这一点吗? 谢谢

【问题讨论】:

  • 只是return a[0]>=b[0] and a[1]<=b[1]
  • @Jean-FrançoisFabre:这测试了a 是否是b 的子范围,这比两个范围在某个时间间隔简单地重叠更有效。
  • true:在 OP 示例中 b 包含 a
  • 您已经确定了确定一个区间是否包含另一个区间的逻辑。你怎么不能为此写if 条件?即便如此,通过搜索“Python 区间包含”也很容易找到代码。这些点击如何没有解决您的问题?没有尝试...
  • 您展示的不是 Python 集,尽管您可以使用 sympy 库制作此类集。 Python 集的值必须是有限的。

标签: python python-3.x math intersection set-theory


【解决方案1】:

只测试边界:

def contains(a,b):
    return a[0]>=b[0] and a[1]<=b[1]

a = (10, 20)
b = (4, 25)

print(contains(a,b))

a = (10, float("inf"))
b = (8, float("inf"))

print(contains(a,b))

b = (80, float("inf"))

print(contains(a,b))

打印:

True
True
False

(因为最后一次测试使条件为假)

附带说明一下,python set 是项目的集合,而不是开始/停止为 tuple 的值范围,因此可能会造成混淆。

另请注意,您的示例令人困惑。如果您想要交集,而不是包含,请定义这样的 intersect 方法:

def intersects(a,b):
    return a[0] <= b[1] and b[0] <= a[1]

【讨论】:

  • 如果没有排序怎么办? return min(a) &gt;= min(b) and max(a) &lt;= max(b) 不是更好吗?
  • 是 +1,如果 Python 3 范围对象实现 &gt;&gt;= 等比较(因为它们已经实现了 ==!=),那就太好了,所以可以做range(4) &gt; range(3),我想自定义类实现是可能的
  • @FHTMitchell 是的,但在那种情况下,我怀疑这有点矫枉过正。 “集合”可能会像 min then max. 一样排序
  • @Chris_Rands 是的,但在 float("inf") 的情况下,无法创建 range
  • 哦,是的,这需要为 linspacenp.arrange 对象实现运算符,无论如何,我猜这对于 OP 来说绝对是矫枉过正
猜你喜欢
  • 2018-10-26
  • 2012-05-12
  • 2015-12-23
  • 2017-01-04
  • 2019-07-15
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多