设置理解和不同的可比关系

时间:2017-05-25 21:48:36

标签: python algorithm set-comprehension

我有一些可以在某种程度上具有可比性的设置对象,我想从集合中删除对象。我想到了这个问题如何改变,在不同的元素之间的可比关系。我对搜索空间的发展,内存的使用以及问题如何扩展感兴趣。

第一种情况: 在最简单的情况下,关系是双向的,因此我们可以删除这两个元素,只要我们可以确保通过删除元素不会删除其他“伙伴”。

第二种情况: 可比较的关系不是双向的。仅删除有问题的元素,而不是可比较的元素。一个简化的场景是由整数组成的集合,可比较的操作将是“可以在不休息的情况下分割”

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

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集的大小,没有复制,对吧?

现在对于算法人员来说:如果一个元素的元素数量之间的关系可以比较,那么这个问题会如何变化。如果可比关系代表部分订单,它会如何变化?

1 个答案:

答案 0 :(得分:3)

我将在确认您的声明之前 - 在迭代它时更改集会触发RuntimeError,这会声称"Set changed size during iteration"的行。

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

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

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

现在到了理解 - 这是一个混乱的。将set设置为参数 - 这比使用全局变量更好 - 正常的代码就像

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)}