7

if else в списковом включении

1

У меня есть список 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]

Но получаю ошибку синтаксиса. Как можно реализовать конструкцию ifelse в списковом выражении?

5 ответ(ов)

8

В вашем коде вы используете списковое включение для изменения значений списка в зависимости от условия. Давайте разберем ваш пример подробнее.

Исходный список 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]

Таким образом, вы реализовали конструкцию "сделать что-то, если <условие>, иначе сделать что-то другое".

3

Причина, по которой вы получаете эту ошибку, связана с тем, как выполняется списковое включение.

Имейте в виду следующее:

[ выражение 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

Обратите внимание, что разница в том, как именно обрабатываются условные выражения и какие значения возвращаются в списке.

3

Для решения задачи, представленной в вашем вопросе, правильно использовать условное выражение 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]

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

1

Ваша ошибка заключается в том, что вы неправильно расположили условие в списковом выражении. В списковом включении сначала указывается выражение, а условие 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, будут исключены из результирующего списка.

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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь