我遇到了这个问题:
给定一个可数i
,两个不相交的集合a
和b
(其中通常a
和b
包含的元素远远多于i
)从a
中删除在i
中找到的所有元素,并将a
中不被^b
例如:
i = [0, 3]
a = {1, 2, 3, 4}
b = {5, 6, 7, 8}
应该导致
a = {1, 2, 4}
b = {0, 5, 6, 7, 8}
根据该图,灰色子集应为空。操作完成后,我希望浅蓝色子集连接到b
,黄色重叠从a
中删除
为了解决这个问题,我编写了以下Python函数:
def foo(i, a, b):
set_i = set(i)
b |= set_i - a
a -= set_i
这是可行的,但它不是很漂亮,仍然会做两次事情(不同的是a
和set_i
)
哪种方式更有效
你就不能像你描述的那样直接做吗:
我不会在适当的地方对a和b进行变异,特别是因为它们是作为函数的参数提供的,所以安全的版本应该是
在一般情况下,它会更有效,因为
i
是一个iterable(可能是一个实际的迭代器),您只需对它迭代一次。如果您将它转换为一个集合,那么在内部它将被迭代一次,然后对于每个集合操作,至少重复两次您还可以像这样使用来自
itertools
的groupby
:尝试:
相关问题 更多 >
编程相关推荐