是否可以将列表作为del的参数传递?

时间:2013-05-30 10:00:10

标签: python list

大家早上好,

我的简单问题如下:我有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技巧可以更有效地完成这项工作? 非常感谢你提前!

1 个答案:

答案 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)}