我有一个值列表和一个索引列表,我需要删除索引所指向的元素。
这是我的解决方案,但我不喜欢实现,因为它需要导入包,当值包含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)
有更好的解决方案吗?
答案 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
函数,它们不是决定性的,但似乎并不比另一个更快。不过,这是在解释器中手动完成的。无法使脚本正常工作。就性能而言,它们并没有太大差别。我不介意其他人可以证明我错了!