【问题标题】:Find maximal pairs in a set of tuples在一组元组中找到最大对
【发布时间】:2021-05-29 22:16:32
【问题描述】:

我必须开发一个递归 Python 函数,它返回 setpairs 中所有最大对的集合。 例如 maximalpairs({(1, 0), (0, 3), (1, 2)}) 应返回 {(1, 2), (0, 3)}。

这是我的实现

def maximalpairs(pairs):
    if len(pairs)==1:
        return pairs
    for tup1 in pairs:
        for tup2 in pairs:
            if all(i > j for i, j in zip(tup1,tup2)):
                pairs.remove(tup2)
                return maximalpairs(pairs)
        pairs.remove(tup1)
        return maximalpairs(pairs)

pairs={ (1, 0), (0, 3), (1, 2) }
print(maximalpairs(pairs))

只返回 (0,3)。 我怎样才能得到正确的结果?

【问题讨论】:

  • “最大对”的定义是什么?
  • 自然数对 (x, y) 在给定的对 setpairs 集合中是最大的,如果它不被集合中的任何其他对 (w, z) 支配,即它不认为:w >= x 和 z >= y 并且至少有一个不等式是严格的。

标签: python python-3.x list set tuples


【解决方案1】:

由于您还没有真正解释什么是最大对,我将假设它是一对 (x,y),例如 y>x。看到示例所需的答案是有道理的。
您的配对是列表,因此没有必要将其复杂化,因为您可以通过索引直接访问列表,也就是 tup[0]tup[1]
一些调试表明 tup1 == tup2 对于您的示例始终是正确的。这是有道理的,因为在每次迭代中,您都会再次调用该函数,从头开始一切,并且您实际上最多只执行 N 次(N = 集合的长度)内部 for,并且最多,一次是外部的,因为它会立即返回。
只执行一次的 for/while 循环并没有真正的用处,所以我们将抛弃外部 for。这给你留下了内在的,那将保持为for tup in pairs: #Stuff
这样,您就不能再使用zip(),因为您不再有两个元组,但不用担心。请记住,您可以通过索引访问数组中的元素,if 语句最终可以简单地成为if (tup[0] > tup[1]): #Stuff。 知道这一切后,代码将保持如下:

def maximalpairs(pairs):
    if len(pairs)==1:
        return pairs
    for tup in pairs:
        if (tup[0] > tup[1]):
            pairs.remove(tup)
            return maximalpairs(pairs)
    return pairs

此代码为您提供预期的结果,即{(1, 2), (0, 3)}
如果我的回答对您有帮助,请不要忘记标记它。谢谢!

编辑:
好的,要做到这一点,您实际上需要双精度,因为我们不能通过索引访问集合,因为它们是无序的,我们需要访问两个元组。我们还是不要使用zip(),本质上是为了避免tup1==tup2 时出现问题(这将始终为真至少一次)。
我们先来看看这个场景。我的猜测是,您实际上并不需要获得重复的最大元组(也就是,如果我再次将 (1,2) 添加到您的示例中,您将不需要像 {(0,3),(1,2),(1,2)} 这样的结果)。因此,让我们通过执行以下操作来避免这种情况:

if (tup2[0] == tup1[0] and tup2[1] == tup1[1]): 
    # Skip the case when tup1==tup2
    continue

现在我们需要解决不等式。请记住,当它被另一个元组支配时,我们只需要在一种情况下删除元组。记住我们访问列表的方式,我知道您需要这样的东西:

if (tup2[0] >= tup1[0] and tup2[1] >= tup1[1]):
    pairs.remove(tup1)
    return maximalpairs(pairs)

因此,通过留下如下代码:

def maximalpairs(pairs):
    if len(pairs)==1:
        return pairs
    for tup1 in pairs:
        for tup2 in pairs:
            if (tup2[0] == tup1[0] and tup2[1] == tup1[1]): 
                # Skip the case when tup1==tup2
                continue
            elif (tup2[0] >= tup1[0] and tup2[1] >= tup1[1]):
                pairs.remove(tup1)
                return maximalpairs(pairs)
    return pairs

结果还是预期的。

【讨论】:

  • 感谢您的解释,非常有用。我在上面添加了“最大对”的定义。
  • 没问题。在看到最大元组的含义后添加了解释和可能的解决方案。
  • 现在一切都清楚了!我已经接近解决方案了,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2019-10-16
  • 2012-10-18
  • 2017-10-28
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多