Конечно, я ожидаю, что числа ниже 20 не появятся в результатах. Похоже, я делаю что-то не так с удалением.
Переведено автоматически
Ответ 1
Вы изменяете список во время итерации по нему. Это означает, что при первом выполнении цикла, i == 1, so 1 удаляется из списка. Затем for цикл переходит ко второму элементу в списке, которого нет 2, но 3! Затем он удаляется из списка, и затем for цикл переходит к третьему элементу в списке, которого теперь 5. И так далее. Возможно, это проще визуализировать подобным образом, с ^, указывающим на значение i:
[1, 2, 3, 4, 5, 6...] ^
Изначально это состояние списка; затем 1 удаляется, и цикл переходит ко второму элементу в списке:
[2, 3, 4, 5, 6...] ^ [2, 4, 5, 6...] ^
И так далее.
Нет хорошего способа изменить длину списка во время итерации по нему. Лучшее, что вы можете сделать, это что-то вроде этого:
numbers = [n for n in numbers if n >= 20]
или это, для изменения на месте (вещь в скобках - это выражение генератора, которое неявно преобразуется в кортеж перед назначением фрагмента):
numbers[:] = (n for n in numbers if n >= 20)
Если вы хотите выполнить операцию над n перед его удалением, один трюк, который вы могли бы попробовать, заключается в следующем:
for i, n inenumerate(numbers): if n < 20: print("do something") numbers[i] = None numbers = [n for n in numbers if n isnotNone]
Ответ 2
Начните с конца списка и идите в обратном направлении:
li = list(range(1, 15)) print(li)
for i inrange(len(li) - 1, -1, -1): if li[i] < 6: del li[i]
Приведенные ниже не являются плохими практиками AFAIK.
РЕДАКТИРОВАТЬ (еще немного):
lis = range(50) lis = lis[20:]
Также выполнит эту работу.
EDIT2 (мне скучно):
functional = filter(lambda x: x> 20, range(50))
Ответ 4
Итак, я нашел решение, но оно действительно неуклюжее...
Прежде всего, вы создаете массив индексов, в котором вы перечисляете все индексы, которые хотите удалить, как показано ниже
numbers = range(1, 50) index_arr = []
for i inrange(len(numbers): if numbers[i] < 20: index_arr.append(i)
после этого вы захотите удалить все записи из списка numbers с индексом, сохраненным в index_arr . Проблема, с которой вы столкнетесь, такая же, как и раньше. Поэтому вам нужно вычесть 1 из каждого индекса в index_arr после того, как вы только что удалили число из numbers arr , как показано ниже:
numbers = range(1, 50) index_arr = []
for i inrange(len(numbers): if numbers[i] < 20: index_arr.append(i)
for del_index in index_list: numbers.pop(del_index)
#the nasty part for i inrange(len(index_list)): index_list[i] -= 1
Это сработает, но я предполагаю, что это не предполагаемый способ сделать это