#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], и это не то, что он хочет