使用 Python 从索引列表中删除多个元素
Remove multiple elements from a list of index with Python
我有一个值列表和一个索引列表,我需要删除索引指向的元素。
这是我的解决方案,但我不喜欢这个实现,因为它需要导入包,当值包含 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)
有更好的解决方案吗?
这应该有效:
def remove_abnormalities(values, indices):
return [val for i, val in enumerate(values) if i not in indices]
此外,如果索引数量很大,您可以在过滤前将 indices
转换为集合以获得更高的性能。
这是一个仅使用内置列表方法的版本。
它相当天真,所以可能有更快的解决方案,但不需要额外的包等,这可能正是您所需要的。
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 专家愿意建议 edits/optimizations 使用此功能,请随意。
编辑
我尝试在花哨的和我天真的实现中都使用 timeit
函数,它们不是决定性的,但一个似乎并不比另一个快。不过,这是在解释器中手动完成的。无法使脚本运行。就性能而言,它们相差不大。不过,如果有人能证明我是错的,我不介意!
我有一个值列表和一个索引列表,我需要删除索引指向的元素。
这是我的解决方案,但我不喜欢这个实现,因为它需要导入包,当值包含 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)
有更好的解决方案吗?
这应该有效:
def remove_abnormalities(values, indices):
return [val for i, val in enumerate(values) if i not in indices]
此外,如果索引数量很大,您可以在过滤前将 indices
转换为集合以获得更高的性能。
这是一个仅使用内置列表方法的版本。
它相当天真,所以可能有更快的解决方案,但不需要额外的包等,这可能正是您所需要的。
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 专家愿意建议 edits/optimizations 使用此功能,请随意。
编辑
我尝试在花哨的和我天真的实现中都使用 timeit
函数,它们不是决定性的,但一个似乎并不比另一个快。不过,这是在解释器中手动完成的。无法使脚本运行。就性能而言,它们相差不大。不过,如果有人能证明我是错的,我不介意!