使用Python从索引列表中删除多个元素

时间:2015-04-10 22:27:55

标签: python list collections

我有一个值列表和一个索引列表,我需要删除索引所指向的元素。

这是我的解决方案,但我不喜欢实现,因为它需要导入包,当值包含maxint时不起作用,并且多次迭代这些值。

def remove_abnormalities(values, indices):
    v = list(values)
    for i in indices:
        v[i] = sys.maxint
    return filter(lambda i: i != sys.maxint, v)

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:8)

这应该有效:

def remove_abnormalities(values, indices):
    return [val for i, val in enumerate(values) if i not in indices]

此外,如果索引数量很大,您可以在过滤之前将indices转换为集合,以获得更高的性能。

答案 1 :(得分:1)

这是一个仅使用内置列表方法的版本。

这是相当幼稚的,所以可能会有更快的解决方案,但不需要额外的包等,这可能是你需要的。

def remove_abnormalities(values, indices):
    list = []
    for i in range(len(values)):
        if i not in indices:
           list.append(values[i])
    return list

print(remove_abnormalities(["A","B","C","D","E","F","G","H"],[1,3,5]))
#output is ['A', 'C', 'E', 'G', 'H']

如果还有其他Python专家想要建议编辑/优化,请不要这样做。

编辑

我试图在花哨和天真的实现上使用timeit函数,它们不是决定性的,但似乎并不比另一个更快。不过,这是在解释器中手动完成的。无法使脚本正常工作。就性能而言,它们并没有太大差别。我不介意其他人可以证明我错了!