集合理解和不同的可比关系
Set comprehension and different comparable relations
我设置了在某种程度上具有可比性的对象,我想从集合中删除对象。我考虑了这个问题如何变化,对于元素之间不同的可比关系。我对搜索的开发 space、内存的使用以及问题的扩展方式很感兴趣。
- 第一种情况:在最简单的情况下关系是双向的因此我们可以删除两个元素,只要我们可以确保通过删除元素不会删除其他 'partners'.
- 第二种情况:可比关系不是双向的。只删除有问题的元素,而不是与之相当的元素。一个简化的场景是由整数组成的集合,可比较的操作是 'is dividable without 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 集的大小,而不是复制,对吗?
- 现在对于算法人员来说:如果一个元素的元素数量之间的关系可以增加,那么这个问题将如何改变。如果可比关系表示部分订单,它会如何变化?
我将首先确认您的声明 - 在迭代时更改集会触发 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)}
我设置了在某种程度上具有可比性的对象,我想从集合中删除对象。我考虑了这个问题如何变化,对于元素之间不同的可比关系。我对搜索的开发 space、内存的使用以及问题的扩展方式很感兴趣。
- 第一种情况:在最简单的情况下关系是双向的因此我们可以删除两个元素,只要我们可以确保通过删除元素不会删除其他 'partners'.
- 第二种情况:可比关系不是双向的。只删除有问题的元素,而不是与之相当的元素。一个简化的场景是由整数组成的集合,可比较的操作是 'is dividable without 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 集的大小,而不是复制,对吗?
- 现在对于算法人员来说:如果一个元素的元素数量之间的关系可以增加,那么这个问题将如何改变。如果可比关系表示部分订单,它会如何变化?
我将首先确认您的声明 - 在迭代时更改集会触发 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)}