In Python or other programming languages, traversing and deleting elements from a sequence can easily lead to accidental deletions, missed deletions, or even program exceptions.
Let’s look at a Python example:
my_list = [1, 2, 3, 4, 5]for x in my_list: if x > 1: my_list.remove(x)
# Expected output: [1], Actual output: [1, 3, 5]print(my_list)
In the above example, the intention is to delete all elements greater than 1, but 3 and 5 were missed.
The process is as follows:
s1: index is 0, element is 1, 1 > 1 is false, keep it, my_list is [1, 2, 3, 4, 5].
s2: index is 1, element is 2, 2 > 1 is true, delete 2, my_list is [1, 3, 4, 5].
s3: index is 2, element is 4, 4 > 1 is true, delete 4, my_list is [1, 3, 5].
s4: index is 3, at this point the length of my_list is 3, exit the loop, my_list finally is [1, 3, 5].
Therefore, the fundamental reason for errors when traversing and deleting elements from a sequence is that deleting elements causes confusion in the index.
To avoid unknown errors when deleting elements from a sequence, there are generally the following methods:
-
Traverse in reverse order, suitable for scenarios where in-place deletion of elements is necessary.
-
Create a new sequence.
-
Traverse a copy of the sequence.
-
Use filter.
Reverse Traversal
my_list = [1, 2, 3, 4, 5]for x in my_list[::-1]: if x > 1: my_list.remove(x)
# Output: [1]print(my_list)
Create a New Sequence
my_list = [1, 2, 3, 4, 5]my_list = [x for x in my_list if x <= 1]
# Output: [1]print(my_list)
Traverse a Copy of the Sequence
my_list = [1, 2, 3, 4, 5]for x in my_list[:]: if x > 1: my_list.remove(x)
# Output: [1]print(my_list)
Use Filter
my_list = [1, 2, 3, 4, 5]my_list = list(filter(lambda x: x <= 1, my_list))
# Output: [1]print(my_list)