如果您绝对必须在迭代列表(或可迭代的)时修改它,请使用向后迭代来执行此操作,如下所示:
def clean_dataset(data: list, items_to_remove: list) -> list:
end_index = len(data) - 1
#enumerate the reversed list to iterate backwards from the last index
for index, value in enumerate(reversed(data)):
if value in items_to_remove:
del data[end_index - index]
return data
你这在小数据集上工作得很好,但随着数据集的扩展很快就会变得不可用。如果您可以删除列表的大片而不是一个接一个地删除,则可以对其进行优化。如果你不能删除大片,那么最好按照建议附加
def new_dataset(data: list, items_to_remove: list) -> list:
new_list = []
for value in data:
if value not in items_to_remove:
new_list.append(value)
return data
出于好奇,我检查了大小数据集的时间,即使只有 750,000 个项目,添加到新列表的速度也快得多:
sorted_category_list = ['Elite Men', 'Elite Women', 'Open Men',
'Open Women', 'Master Men', 'Master Women',
'U21 Men', 'U21 Women','U17 Men', 'U17 Women',
'U17 Men', 'U17 Women', 'U15 Mixed',
'Hardtail', 'E-Bike']
sorted_category_list3 = ['Elite Men', 'Elite Women', 'Open Men',
'Open Women', 'Master Men', 'Master Women',
'U21 Men', 'U21 Women','U17 Men', 'U17 Women',
'U17 Men', 'U17 Women', 'U15 Mixed',
'Hardtail', 'E-Bike']*50000
keys_list = ['Elite Men', 'Elite Women', 'Open Men',
'Open Women', 'U15 Mixed', 'U17 Men', 'U21 Men', 'U21 Women']
if __name__ == "__main__":
print('timing:')
x1 = timeit.timeit("clean_dataset(sorted_category_list, keys_list)",
setup="from __main__ import clean_dataset,
sorted_category_list, keys_list",
number=1)
print(f"removal - small dataset: {x1:15.15f}")
x2 = timeit.timeit("new_dataset(sorted_category_list, keys_list)",
setup="from __main__ import new_dataset,
sorted_category_list, keys_list",
number=1)
print(f"append - small dataset: {x2:15.15f}")
y1 = timeit.timeit("clean_dataset(sorted_category_list3, keys_list)",
setup="from __main__ import clean_dataset,
sorted_category_list3, keys_list",
number=1)
print(f"removal - large dataset: {y1:15.15f}")
y2 = timeit.timeit("new_dataset(sorted_category_list3, keys_list)",
setup="from __main__ import new_dataset,
sorted_category_list3, keys_list",
number=1)
print(f"append - large dataset: {y2:15.15f}")
输出:
timing:
removal - small dataset: 0.000006600000000
append - small dataset: 0.000005500000000
removal - large dataset: 17.711741400000001
append - large dataset: 0.064716900000001