if else в списковом включении
У меня есть список l
:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
Мне нужно для чисел, которые больше или равны 45, добавлять 1, а для чисел меньше 45 — добавлять 5.
Я пробовал использовать следующее выражение:
[x+1 for x in l if x >= 45 else x+5]
Но получаю ошибку синтаксиса. Как можно реализовать конструкцию if
– else
в списковом выражении?
5 ответ(ов)
В вашем коде вы используете списковое включение для изменения значений списка в зависимости от условия. Давайте разберем ваш пример подробнее.
Исходный список l
содержит числа:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
В списковом включении вы проверяете каждое значение x
в списке l
. Если значение больше или равно 45 (x >= 45
), вы увеличиваете его на 1 (x + 1
). В противном случае (если значение меньше 45) вы увеличиваете его на 5 (x + 5
).
Таким образом, выражение, которое вы использовали, выглядит следующим образом:
[x + 1 if x >= 45 else x + 5 for x in l]
Результатом выполнения этого выражения будет новый список, где каждое число изменено согласно условию. В вашем случае результат будет таким:
[27, 18, 46, 51, 99, 70, 48, 49, 6]
Таким образом, вы реализовали конструкцию "сделать что-то, если <условие>
, иначе сделать что-то другое".
Причина, по которой вы получаете эту ошибку, связана с тем, как выполняется списковое включение.
Имейте в виду следующее:
[ выражение for item in list if условие ]
Эквивалентно:
for item in list:
if условие:
выражение
Где выражение
немного отличается (представьте, что вы меняете порядок подлежащего и сказуемого в предложении).
Таким образом, ваш код [x+1 for x in l if x >= 45]
выполняется так:
for x in l:
if x >= 45:
x + 1
Однако этот код [x+1 if x >= 45 else x+5 for x in l]
выполняется следующим образом (после переработки выражения
):
for x in l:
if x >= 45:
x + 1
else:
x + 5
Обратите внимание, что разница в том, как именно обрабатываются условные выражения и какие значения возвращаются в списке.
Для решения задачи, представленной в вашем вопросе, правильно использовать условное выражение Python в списковом включении. Если вы хотите изменить элементы списка l
так, чтобы каждое значение x
было увеличено на 1, если x
больше или равно 45, и на 5 в противном случае, вы можете использовать следующую конструкцию:
[x + 1 if x >= 45 else x + 5 for x in l]
Это выражение перебирает все значения в списке l
, применяя условие для каждого элемента.
Что касается вашего комментария, он вполне уместен и очень полезен для запоминания. Действительно, условное выражение в Python следует записывать как a if C else b
, а не как C ? a : b
, как в некоторых других языках.
На заметку, ваш пример с фильтрацией:
[a for i in items if C else b]
некорректен. Правильная форма записи должна выглядеть так:
[a if C else b for i in items]
Здесь C
— это некоторое условие, а a
и b
— значения, которые выбираются в зависимости от выполнения условия.
Также существует корректный способ записи, если вам нужно отфильтровать элементы:
[a for i in items if C]
Это выражение возвращает только те элементы a
, для которых условие C
истинно. Вы можете комбинировать фильтрацию и условные выражения следующим образом:
[a if tC else b for i in items if fC]
Таким образом, вы сможете адаптировать ваш список по нескольким условиям, что очень полезно в сложных сценариях.
Ваша ошибка заключается в том, что вы неправильно расположили условие в списковом выражении. В списковом включении сначала указывается выражение, а условие if
в конце используется для фильтрации элементов. Корректный синтаксис будет выглядеть так:
[x + 1 if x >= 45 else x + 5 for x in l]
В этом выражении для каждого значения x
из списка l
будет проверяться, является ли x
больше или равно 45. Если это так, к x
будет добавлено 1; в противном случае будет добавлено 5. Если вам нужно отфильтровывать элементы по какому-то признаку, вы можете добавить if
в конце спискового выражения, например:
[x + 1 if x >= 45 else x + 5 for x in l if x > 0]
Здесь элементы, не удовлетворяющие условию x > 0
, будут исключены из результирующего списка.
В выражении [a if condition1 else b for i in list1 if condition2]
используются два if
с разными условиями. Часть (a if condition1 else b)
соответствует лямбда-функции:
lambda x: a if condition1 else b
В то время как condition2
представляет собой другую лямбда-функцию:
lambda x: condition2
Все выражение в виде генератора списка можно рассматривать как комбинацию map
и filter
:
map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))
Таким образом, сначала происходит фильтрация list1
по условию condition2
, а затем для оставшихся элементов применяется выражение a if condition1 else b
.
Создать список из одного элемента, повторенного N раз
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Создание словаря с помощью генератора словарей
Диапазон букв в Python
Как создать строку с разделением запятой из списка строк?