大家早上好,
我的简单问题如下:我有2个长度为T的列表(我们称之为 a 和 b ),我想要消除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技巧可以更有效地完成这项工作? 非常感谢你提前!
答案 0 :(得分:1)
不,没有办法做到这一点。
原因是del
删除了一个名称 - 如果该对象还附加了另一个名称,它将继续存在。对象本身没有受到影响。
当您在列表中存储对象时,它们没有附加名称,只有索引。
这意味着当你有一个对象列表时,Python不知道引用这些对象的名称(如果有的话),所以它不能删除它们。它最多可以从特定列表中删除它们。
最佳解决方案是创建一个不包含您不想要的值的新列表。这可以通过list comprehension:
来实现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)}