我有一个集合对象在某种程度上是可比的,我想从集合中移除对象我思考了这个问题是如何变化的,在不同的可比性元素之间的关系。我对搜索空间的开发、记忆的使用以及问题的规模感兴趣。
第一种情况:
在最简单的场景中,关系是双向的,因此我们可以删除这两个元素,只要我们可以确保通过删除这些元素不会删除其他“合作伙伴”。
第二种情况:
可比关系不是双向的。只删除有问题的元素,而不是与之相当的元素。一个简化的场景是由整数组成的集合,可比较的操作是“不带rest就可分割的”
我可以执行以下操作,而不是删除元素:

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集的大小,除非复制,对吗?
现在对于ALGO的人来说:如果一个元素的个数可以与增加的个数相比较,这个问题如何改变?如果可比关系代表部分订单,它会发生什么变化?

最佳答案

我将首先确认您的索赔更改集,同时迭代它将触发一个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)}

09-10 16:28