仅根据属性从集合中删除多个元素的最快方法是什么? (例如删除所有负数。)

问题描述 投票:0回答:1

在以下示例中,所有负数都将从集合中删除。
但首先我必须创建负数的子集。
这似乎不是实现这一目标的最有效方法。

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

这确实有效,而且可能更快。

python arrays set binary-matrix
1个回答
0
投票

在你的情况下具有一定的理解力

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}) }
© www.soinside.com 2019 - 2024. All rights reserved.