0

大家早上好,

我的简单问题如下:我有 2 个长度为 T 的列表(我们称它们为 ab),我想从每个列表中消除 K 个随机元素(具有相同的索引)。
让我们暂时假设 K << T,以便忽略提取相同索引两次或更多次的概率。我可以简单地生成 K 个随机数的列表aleaindex并将其传递给del,比如

for i in range(K):
    aleaindex.append(random.randint(0, T-1))
del a[aleaindex]
del b[aleaindex]

是否有一些 Python 技巧可以更有效地做到这一点?
非常感谢您!

4

1 回答 1

1

不,没有办法做到这一点。

这样做的原因是del删除了一个名称——如果还有另一个名称附加到对象上,它将继续存在。对象本身没有被触及。

当您将对象存储在列表中时,它们没有附加名称,只有索引。

这意味着当你有一个对象列表时,Python 不知道引用这些对象的名称(如果有的话),所以它不能删除它们。它最多可以将它们从该特定列表中删除。

最好的解决方案是创建一个不包含您不想要的值的新列表。这可以通过列表理解来实现:

new_a = [v for i, v in enumerate(a) if i not in aleaindex]

a如果您需要修改列表 ( a[:] = ...) ,您始终可以将其分配回。

请注意,进行集合也更有意义aleaindex,因为它会使此操作更快,并且顺序无关紧要:

aleaindex = {random.randint(0, T-1) for _ in range(K)}
于 2013-05-30T10:06:01.013 回答