Strange results when removing items from list while iterating over list in Python

WBOY
Release: 2024-02-09 10:10:04
forward
674 people have browsed it

在 Python 中迭代列表时从列表中删除项目时出现奇怪的结果

Question content

I have this code:

numbers = list(range(1, 50))

for i in numbers:
    if i < 20:
        numbers.remove(i)

print(numbers)
Copy after login

However, the result I get is:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

Of course, I hope that no number below 20 will appear in the result. Looks like I did something wrong when deleting.


Correct Answer


You are modifying the list while iterating over it. This means that the first time through the loop, i == 1, so 1 is removed from the list. Then the for loop goes to the second item in the list, which is not 2, but 3! It is then removed from the list and the for loop continues with the third item in the list, which is now 5. So on and so forth. Maybe it's easier to visualize this, using ^ to point to the value of i:

[1, 2, 3, 4, 5, 6...]
 ^
Copy after login

This is the initial state of the list; then 1 is deleted and the loop goes to the second item in the list:

[2, 3, 4, 5, 6...]
    ^
[2, 4, 5, 6...]
       ^
Copy after login

etc.

There is no good way to change the length of a list while iterating it. The best thing you can do is this:

numbers = [n for n in numbers if n >= 20]
Copy after login

Or this, for in-place changes (the thing in the brackets is a generator expression that is implicitly converted to a tuple before the slice is assigned):

numbers[:] = (n for n in numbers if n >= 20)
Copy after login

If you want to perform an operation on n before deleting it, one trick you can try is:

for i, n in enumerate(numbers):
    if n < 20:
        print("do something")
        numbers[i] = None
numbers = [n for n in numbers if n is not None]
Copy after login

The above is the detailed content of Strange results when removing items from list while iterating over list in Python. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!