Почему два метода l oop возвращают правильный результат в первый раз, а третий метод делает три запуска, чтобы получить правильный результат? - PullRequest
0 голосов
/ 27 апреля 2020

Я изо всех сил пытаюсь понять, почему мой сценарий 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)

1 Ответ

0 голосов
/ 27 апреля 2020

В следующем коде:

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

Как только вы сделаете remove, например, для элемента 9, вы фактически уменьшите размер списка на 1 и перенумеруете все последующие элементы. Даже после 3 итераций вы даже не получите те же элементы, что и в первых двух методах. Если вы собираетесь сделать это, удалив элементы, то удалите в обратном порядке:

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