【问题标题】:Set comprehension and different comparable relations集合理解和不同的可比关系
【发布时间】:2026-01-04 07:05:01
【问题描述】:

我设置了在某些方面具有可比性的对象,我想从集合中删除对象。我考虑了这个问题如何变化,对于元素之间的不同可比关系。我对搜索空间的开发、内存的使用以及问题的扩展方式很感兴趣。

  • 第一种情况:在最简单的情况下关系将是双向的,因此我们可以删除这两个元素,只要我们可以确保通过删除元素不会删除其他“合作伙伴”。
  • 第二种情况:可比关系不是双向的。仅删除有问题的元素,而不是与之可比较的元素。一个简化的场景是由整数组成的集合,可比较的操作是“可整除”

我可以执行以下操作,而不是删除元素:

a_set = set([4,2,3,7,9,16])

def compare(x, y):
    if (x % y == 0) and not (x is y):
        return True
    return False

def list_solution():
    out = set()
    for x in a_set:
        for y in a_set:
            if compare(x,y):
                out.add(x)
                break
    result = a_set-out
    print(result)

    

当然,作为一名初级 Python 程序员,我的第一个问题是:

  • 对此合适的集合理解是什么?
  • 另外:我不能在不复制的情况下在迭代期间修改 Python 集的大小,对吧?
  • 现在对于算法人员来说:如果一个元素的元素数量之间的关系可以比较增加,这个问题将如何改变。如果可比关系表示偏序,它会如何变化?

【问题讨论】:

    标签: python algorithm set-comprehension


    【解决方案1】:

    我将先确认您的声明 - 在迭代时更改集合会触发 RuntimeError,这将声明类似于 "Set changed size during iteration" 的内容。


    现在,让我们从compare 函数开始:因为您使用的是集合,所以x is y 可能类似于x == y,如果可能,最后一个总是更好的选择。

    此外,不需要条件;你已经在表演了:

    def compare (x, y):
        return x != y and x % y == 0
    

    现在到集合理解——那是一个混乱的理解。将集合设置为参数后 - 这比使用全局变量更好 - 正常代码将类似于

    for x in my_set:
        for y in my_set:
            if compare(x, y):
                for a in (x, y):
                    temp.append(a)
    

    注意最后两行,它们不使用解包,因为这在理解中是不可能的。现在,剩下的就是将a 移到最前面并让所有: 消失——奇迹发生了:

    def list_solution (my_set):
        return my_set - {a for x in my_set for y in my_set if compare(x, y) for a in (x, y)}
    

    你可以用类似的东西来测试它

    my_set = set([4, 2, 3, 7, 9, 16])
    print(list_solution(my_set)) # {7}
    
    • (x, y) 上的条件和迭代可以切换位置 - 但我相信在确认后进行迭代会比进入并在有机会不执行任何操作时开始迭代更快。

    第二种情况的变化很小 - 仅使用 x 而不是 x, y 解包:

    def list_solution_2 (my_set):
        return my_set - {x for x in my_set for y in my_set if compare(x, y)}
    

    【讨论】: