• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

В чём проблема кода на Python 3?

iBragimoff

Green Team
09.07.2019
83
19
BIT
0
Python:
mas = [1,2,3,4,5,6,7]
for i in mas:
    if i%3 == 0: continue
    else: mas.remove(i)
Вывод: [2, 3, 5, 6]

Код должен удалять из списка числа не кратные 3, но при выводе в списке находятся числа не кратные 3. В чём проблема?
 

f22

Codeby Academy
Gold Team
05.05.2019
1 909
226
BIT
1 543
Код должен удалять из списка числа не кратные 3, но при выводе в списке находятся числа не кратные 3. В чём проблема?
Проблема в том, что после выполнения метода mas.remove(i), происходит изменения размера массива.
И цикл перескакивает через значение.

Вот как образно выглядят итерации:
for i in mas:
1. Первый элемент 1
2. Остаток от деления 1 на 3 есть? да, удаляем 1.
в этот момент список представляет собой последовательность
[2,3,4,5,6,7]
3. Второй элемент 3 (первый мы удалили, а второй занял его место)
4. Остаток от деления 3 на 3 есть? нет, оставляем
5. Третий элемент 4
6. Остаток от деления 4 на 3 есть? да,удаляем 4.
[2,3,5,6,7]
5. Четвёртый элемент 6
и так далее.


Если тебе нужно просто получить числа не кратные 3. Лучше создать ещё один массив и туда складировать результаты.
Python:
mas = [1, 2, 3, 4, 5, 6, 7]
result = []
for i in mas:
    if i%3 != 0:
        result.append(i)

print(result)
[1, 2, 4, 5, 7]
3 и 6 остаток от деления на 3 не дают, поэтому в результирующий список не попали.

Если нужно получить кратные, меняешь
if i%3 != 0: на if i%3 == 0:

Есть ещё одно более элегантное решение: перебор списка с конца.
Тут два варианта:
1. Использовать встроенный метод reversed()
Python:
mas = [1, 2, 3, 4, 5, 6, 7]
for i in reversed(mas):
    if i%3 != 0:   
        mas.remove(i)
print(mas)

[3, 6]

2. Использовать ужасного вида конструкцию вроде этой
Python:
mas = [1, 2, 3, 4, 5, 6, 7]
# Перебираем массив с len(mas) - последний элемент, до -1 не включительно, с шагом -1
for i in range(len(mas), -1, -1):
    if i%3 != 0:   
        mas.remove(i)

print(mas)
[3, 6]
 
Последнее редактирование:

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
@f22 написал подходящие варианты, и они хорошо будут работать в неупорядоченных списках.

В данном случае, поскольку нужно узнать вывод из цифр, которые идут подряд, нужно использовать функцию range. Представьте, что список не 7 цифр, а 1000 например. Согласитесь, что такой длинный список неразумно использовать в коде.

Вот решение:

Python:
res = []
for i in range(1, 8):
    if i % 3 == 0:
        res.append(i)
print(res)

Ещё вариант, когда нужно всё-таки подать на вход именно список упорядоченных цифр, это использовать индексы с помощью функции enumerate.

Python:
mas = [1, 2, 3, 4, 5, 6, 7]
res = []
for i, value in enumerate(mas):
    if i != 0 and i % 3 == 0:
        res.append(i)
print(res)

ТС, пользуйся стандартными функциями, они часто выручают.
 

f22

Codeby Academy
Gold Team
05.05.2019
1 909
226
BIT
1 543
Код должен удалять из списка числа не кратные 3, но при выводе в списке находятся числа не кратные 3. В чём проблема?
Как говорится, нет предела совершенству.
Наткнулся на функцию filter() в Python.
Принимая на вход 2 параметра, первый - функцию, которая возвращает булево значение, а второй - итерируемый объект,
она применяет функцию к списку.

Можно использовать вот так:

Если нужно получить из списка только значения, кратные трём, то сначала описываем функцию
Python:
def three_multiply(target_x):
    return target_x %3 == 0
Функция принимает на вход число, если оно делится на 3 без остатка, возвращается True, иначе - False
А теперь, применив функцию filter, можем получить только числа кратные трём
Python:
mas = [1,2,3,4,5,6,7]
output_list = list(filter(three_multiple, mas))
print(output_list)
[3, 6]

Познав дзен Python'a и программирования в целом (а так же изучив канал Олега Молчанова)
Можно весь код выше уместить в одну строку:
Python:
mas = [1,2,3,4,5,6,7]
ouput_list = list(filter(lambda target_x: target_x %3 == 0, mas))
#В списке ouput_list мы получим, нужные данные
[3, 6]
Если нужно получить числа, у которых остаток деления на 3, не равен 0,
банально меняем знак равенства
Python:
mas = [1,2,3,4,5,6,7]
print(list(filter(lambda target_x: target_x %3 != 0, mas)))
[1, 2, 4, 5, 7]

Если расписать подробно, то
1. команда print() выводит на экран
2. данные, которые преобразованы в список методом list()​
3. в котором используется функция filter(), принимающая в виде параметров​
3.1. анонимную функцию (lambda), которая​
4.1. принимает на вход target_x​
4.2 и возвращает булево значение результата выражения target_x %3 != 0​
3.2.и массив mas​
Результат этого выражения можно присвоить какой-то переменной:
Python:
mas = [1,2,3,4,5,6,7]
new_list = list(filter(lambda target_x: target_x %3 != 0, mas))
print(new_list)
[1, 2, 4, 5, 7]

Такой же список можно получить и с помощью генератора списков
Python:
mas = [1,2,3,4,5,6,7]
new_list = [ target_x for target_x in mas if target_x %3 != 0 ]
print(new_list)
[1, 2, 4, 5, 7]
 
Последнее редактирование:

iBragimoff

Green Team
09.07.2019
83
19
BIT
0
Как говорится, не пределу совершенства.
Наткнулся на функцию filter() в Python.
Принимая на вход 2 параметра, первый - функцию, которая возвращает булево значение, а второй - итерируемый объект,
она применяет функцию к списку.

Можно использовать вот так:

Если нужно получить из списка только значения, кратные трём, то сначала описываем функцию
Python:
def three_multiply(target_x):
    return target_x %3 == 0
Функция принимает на вход число, если оно делится на 3 без остатка, возвращается True, иначе - False
А теперь, применив функцию filter, можем получить только числа кратные трём
Python:
mas = [1,2,3,4,5,6,7]
output_list = list(filter(three_multiple, mas))
print(output_list)
[3, 6]

Познав дзен Python'a и программирования в целом (а так же изучив канал Олега Молчанова)
Можно весь код выше уместить в одну строку:
Python:
mas = [1,2,3,4,5,6,7]
ouput_list = list(filter(lambda target_x: target_x %3 == 0, mas))
#В списке ouput_list мы получим, нужные данные
[3, 6]
Если нужно получить числа, у которых остаток деления на 3, не равен 0,
банально меняем знак равенства
Python:
mas = [1,2,3,4,5,6,7]
print(list(filter(lambda target_x: target_x %3 != 0, mas)))
[1, 2, 4, 5, 7]

Если расписать подробно, то
1. команда print() выводит на экран
2. данные, которые преобразованы в список методом list()​
3. в котором используется функция filter(), принимающая в виде параметров​
3.1. анонимную функцию (lambda), которая​
4.1. принимает на вход target_x​
4.2 и возвращает булево значение результата выражения target_x %3 != 0​
3.2.и массив mas​
Результат этого выражения можно присвоить какой-то переменной:
Python:
mas = [1,2,3,4,5,6,7]
new_list = list(filter(lambda target_x: target_x %3 != 0, mas))
print(new_list)
[1, 2, 4, 5, 7]

Такой же список можно получить и с помощью генератора списков
Python:
mas = [1,2,3,4,5,6,7]
new_list = [ target_x for target_x in mas if target_x %3 != 0 ]
print(new_list)
[1, 2, 4, 5, 7]
Согласен. Совершенство недосягаемо, особенно в программировании. Спасибо за помощь!
А за канал отдельный поклон :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!