Пытался построить алгоритм для определенных чисел из списка, он пропускает числа?

#python-3.x

#python-3.x

Вопрос:

Я написал скрипт, который в какой-то момент выдает мне список чисел. Мне нужны только числа между 11 и 88. Это то, что я пробовал, упрощенный:

 m = [13, 2, 3, 23, 1]
for x in range(len(m)-1):
    if m[x] < 11 or m[x] > 88:
        del m[x]
print(m)
  

Распечатываемый список является [13, 3, 23] .

Если я печатаю отдельные элементы списка, которые входят в цикл for, я получаю этот вывод:

 13
2
23
1
[13, 3, 23]
  

Почему он пропускает 3?

Ответ №1:

Я думаю, вам нужно:

 m = [13, 2, 3, 23, 1]

new_m = []
for i in m:
    if i> 11 and i<88:
        new_m.append(i)

print(new_m)
  

См. почему удалять элемент из списка во время итерации — плохая идея

Ответ №2:

Вы меняете размер списка одновременно с итерацией по нему, что в целом не очень хорошая идея. Вместо этого вы должны создать новый список с нужными вам элементами.

 m = [13, 2, 3, 23, 1]
new = []
for i in m:
    if i > 11 and i < 88:
        new.append(i)
print(new)
  

И если вы подумаете о случае, приведенном ранее
когда x было 1, вы удалили 2, таким образом, новый список был [13,3,23,1] таким же для следующего x; x = 2 m[x] было 23, а не 3, поскольку 3 сейчас находится в индексе 1, и именно поэтому 3 все еще было там.

Ответ №3:

Одна строка для этого, используемая для понимания

 m = [x for x in m if 11 <= x <= 88]
  

Ответ №4:

Поскольку вы используете тот же массив to в цикле, если вы удалите значение, размер массива изменится. Чтобы избежать этого, вы можете использовать цикл While для выполнения этого.

Ниже Время скрипта O (n) Пробел O (1)

 m = [13, 2, 3, 23, 1]
i=0
while i < len(m):
  if m[i] < 11 or m[i] > 88:
    del m[i]
  else:
    i =1
print(m)
  

Ответ №5:

Попробуйте это:

 m = [13, 2, 3, 23, 1]
newList = [x for x in m if not ((x<11) or (x>88))]
print (newList)

Output: [13,23]
  

Комментарии:

1. неверный вывод. ваш вывод должен быть [2,3,1], и это не то, что он хочет