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

Я полностью сбит с толку этим. Я использую FOR l oop, который идентифицирует все четные числа (модульное деление) и сохраняет их.

Однако каждый раз, когда я запускаю l oop для одного и того же списка чисел, длина списка уменьшается ? Я не очень понимаю это, поскольку наверняка все эти числа должны быть удалены при первом запуске l oop?

Я скопировал код ниже.

# 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") 

# Remove odd numbers
counter     = 0

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)))

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)))

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)))

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: понял, что первая загрузка была неправильным (и файл И структура и просто все) код, теперь это должна быть правильная версия.

Ответы [ 4 ]

1 голос
/ 24 апреля 2020

Это происходит потому, что вы повторно добавляете четные числа в список. Что это значит?

foo = []
for i in range(1, 7):
    foo.append(i)
for i in range(1, 7):
    foo.append(i)
# foo == [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]

Надеюсь, это поможет проиллюстрировать происходящее. Попробуйте удалить приложение во второй и третий раз. Код будет:

# 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") 

# Remove odd numbers
evenNumbers = []
counter     = 0

for i in range(len(randomNumbers)): 
    if(i % 2 == 0):
        evenNumbers.append(i)
        counter += 1
print("Loop run: "+str(counter))
print('\t > List length = '+str(len(evenNumbers)))

for i in range(len(randomNumbers)): 
    if(i % 2 == 0):
        counter += 1
print("Loop run: "+str(counter))
print('\t > List length = '+str(len(evenNumbers)))

for i in range(len(randomNumbers)): 
    if(i % 2 == 0):
        counter += 1
print("Loop run: "+str(counter))
print('\t > List length = '+str(len(evenNumbers)))

Я заменил его диапазоном, но вы можете использовать метод, который вы использовали, который тоже работает.

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

Другие ребята, похоже, ответили на ваш вопрос довольно хорошо, поэтому я предложил более простое альтернативное решение, не требующее для l oop удаления нечетных чисел. Вы можете использовать функцию фильтра, чтобы делать то, что вы хотите.

from random import randint

rand_nums = []
for _ in range(100):  # if you are using 100 as the range, it will create a list with length 100
    rand_int = randint(0, 1000)
    rand_nums.append(rand_int)
print(f"List of {len(rand_nums)} values: {rand_nums}")

# Remove odd numbers
evens_only = list(filter(lambda x: x % 2 == 0, rand_nums))
print(f"List of even values only: {evens_only}\nLength of even list: {len(evens_only)}")

Вот еще один способ сделать это, используя понимание списка:

from random import randint
rand_nums = [randint(0, 1000) for j in range(100)]
print(f"List of {len(rand_nums)} values: {rand_nums}")
evens_only = [i for i in rand_nums if i % 2 == 0]
print(f"List of even values only: {evens_only}\nLength of even list: {len(evens_only)}") 
0 голосов
/ 24 апреля 2020

Массив evenNumbers находится в глобальной области видимости и поэтому остается в памяти после каждого l oop.
Значения накапливаются, и поэтому вы видите удвоение длины после второго l oop и утроение после третьего l oop.

Для получения дополнительной информации о области видимости переменных в Python, посетите страницу W3schools или прочитайте документацию по языку .

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

вы снова и снова используете один и тот же список и ...... снова:)

# 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") 

# Remove odd numbers
evenNumbers = []
counter     = 0

for i in randomNumbers: 
    if(i % 2 == 0):
        evenNumbers.append(i)
counter += 1
print("Loop run: "+str(counter))
print('\t > List length = '+str(len(evenNumbers)))

# RESET THE LIST
evenNumbers = []

for i in randomNumbers: 
    if(i % 2 == 0):
        evenNumbers.append(i)
counter += 1
print("Loop run: "+str(counter))
print('\t > List length = '+str(len(evenNumbers)))

# RESET THE LIST
evenNumbers = []

for i in randomNumbers: 
    if(i % 2 == 0):
        evenNumbers.append(i)
counter += 1
print("Loop run: "+str(counter))
print('\t > List length = '+str(len(evenNumbers)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...