在以下示例中,所有负数都将从集合中删除。
但首先我必须创建负数的子集。
这似乎不是实现这一目标的最有效方法。
my_set = {-100, -5, 0, 123, 3000}
my_set.difference_update({e for e in my_set if e < 0})
assert my_set == {0, 123, 3000}
在标题中我指的是一个集合,但我的意思是数学意义上的。
我的问题不特定于数据类型。
下面的例子是我真正想做的。
我有一组对,也可以看作二进制矩阵,
我想删除该矩阵的一些行和列。
同样,创建该集合的努力
to_be_removed
对我来说似乎是浪费了。my_set = {
(0, 0), (0, 2), (0, 3), (0, 6), (0, 7), (1, 0),
(2, 3), (2, 4), (2, 7), (3, 3), (3, 7), (3, 9),
(4, 2), (4, 4), (4, 6), (4, 10), (5, 0), (6, 0),
(6, 1), (6, 3), (6, 8), (6, 9), (7, 1), (7, 9)
}
to_be_removed = {(i, j) for (i, j) in my_set if i in {0, 1, 7} or j in {0, 1, 6, 7, 10}}
assert to_be_removed == {
(0, 0), (0, 2), (0, 3), (0, 6), (0, 7), (1, 0), (2, 7), (3, 7),
(4, 6), (4, 10), (5, 0), (6, 0), (6, 1), (7, 1), (7, 9)
}
my_set.difference_update(to_be_removed)
assert my_set == {(2, 3), (2, 4), (3, 3), (3, 9), (4, 2), (4, 4), (6, 3), (6, 8), (6, 9)}
也许
set
不允许这样做。但我不关心数据类型。编辑: 乔的评论表明以下内容:
my_set = {(i, j) for (i, j) in my_set if i in {2, 3, 4, 5, 6} and j in {2, 3, 4, 5, 8, 9}}
这确实有效,而且可能更快。
在你的情况下具有一定的理解力
my_set = {e for e in my_set if (e[0] not in {0, 1, 7}) and (e[1] not in {0, 1, 6, 7, 10}) }