为什么两个循环方法第一次返回正确的结果,而第三个方法需要三次运行才能获得正确的结果



我很难理解为什么我的Python脚本对我的前两个方法给出了相同的答案,但对于第三个方法,我必须运行该过程至少3次才能得到正确的答案。

我知道我的第一种方法可能是最有效的,但我试图理解为什么第三种方法第一次没有达到相同的结果。

代码张贴在下面,谢谢!

# Sanity check - Modular [remainder] divison in loops
# Python Libraries 
from random import randint
# Create a list of 50 random integers between 0 and 1000
randomNumbers = []
for i in range(100): 
randomInt = randint(0, 1000) 
randomNumbers.append(randomInt)
print("List of 50 values: ", randomNumbers,"n") 
##########################################################
# METHOD 1: Remove odd numbers - New list based
newList     = [x for x in randomNumbers if x % 2 == 0]
print('List comprehension method...')
print('t > List length = '+str(len(newList)))
print(newList)
print('n')
# METHOD 2: Keep even numbers - Loop Based
evenList = []
for i in randomNumbers:
if i % 2 == 0:
evenList.append(i)
print("List append method...")
print('t > List length = '+str(len(evenList)))
print(evenList)
print('n')
# METHOD 3: Remove odd numbers - Loop Based
counter     = 0
# > Loop 1
for i in randomNumbers: 
if i % 2 != 0:
randomNumbers.remove(i)
counter += 1
print("Loop run: "+str(counter))
print('t > List length = '+str(len(randomNumbers)))
print(randomNumbers)
# > Loop 2
for i in randomNumbers: 
if i % 2 != 0:
randomNumbers.remove(i)
counter += 1
print("Loop run: "+str(counter))
print('t > List length = '+str(len(randomNumbers)))
print(randomNumbers)
# > Loop 3
for i in randomNumbers: 
if i % 2 != 0:
randomNumbers.remove(i)
counter += 1
print("Loop run: "+str(counter))
print('t > List length = '+str(len(randomNumbers)))
print(randomNumbers)
# > Loop 4
for i in randomNumbers: 
if i % 2 != 0:
randomNumbers.remove(i)
counter += 1
print("Loop run: "+str(counter))
print('t > List length = '+str(len(randomNumbers)))
print(randomNumbers)

在以下代码中:

for i in randomNumbers: 
if i % 2 != 0:
randomNumbers.remove(i)

一旦对元素9执行remove(例如(,就可以有效地将列表的大小减少1,并对所有后续元素重新编号。即使在3次迭代之后,您甚至不会得到与前两个方法相同的元素。如果你要通过删除元素来做到这一点,那么按相反的顺序删除:

for i in range(len(randomNumbers) - 1, -1, -1):
if randomNumbers[i] % 2 != 0:
del randomNumbers[i]

最新更新