Вопрос №55432 от пользователя Сергей Гаранин в уроке «Генераторы списков», курс «Python: Декларативное программирование»

Сергей Гаранин

Добрый день! Подскажите пожалуйста. Почему вложенным циклом корректно убираются False значения, а дальше пустые списки не отсеиваются

def non_empty_truths():
    some_list = [[0, ""], [False, None]]
    return [[y for y in x if y] for x in some_list if x]
print(non_empty_truths())
[[], []]

НО здесь убирает:

def non_empty_truths():
    some_list = [[0, 1, 2], [], [], [False, True, 42]]
    print([[y for y in x if y] for x in some_list if x])
[[1, 2], [True, 42]]

еще не понимаю как работает это :

1 == True
True
1 == False
False
[1] == True
False
[1] == False
False
[1, 2, 3] == True
False
6 0

Станислав Дзисяк

Сергей, приветствую!

Почему вложенным циклом корректно убираются False значения, а дальше пустые списки не отсеиваются НО здесь убирает:

Пустые списки отфильтровываются благодаря условию if x, так как пустой список приводится к False, потому условие if x не выполняется. Вы можете убедиться в этом выполнив в REPL приведение bool([]). В первом же случае сами списки не отфильтровываются потому как они не пустые и приводятся к логическому значению True. Например, попробуйте выполнить в REPLbool([0, ""]). Но уже далее с помощью второго цикла и условия if y мы отфильтровываем элементы самого списка, и если они приводятся к логическому значению False, то добавлены в список не будут. Но сам список то уже добавлен, потому на выходе и получается пустой список.

еще не понимаю как работает это :

Попробуйте в REPL каждое из значений привести к логическому с помощью bool(value). Так сразу станет понятно почему условные выражения истинны или ложные.

1

Aleksei Pirogov

Сергей Гаранин, единица равна True потому, что True и False с точки зрения внутреннего представления это единица и ноль, пусть даже тип у этих констант выводится как bool. Так исторически сложилось. Список же никогда не будет равен булеву значению, потому что это разные типы.

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

Потому что отсеивание делается не "дальше"!

Условие проверяется для входных значений, а не для новых, которые вы на основе входных получаете. И для каждого входного значения условие проверяется до вычисления выходного элемента. Так, пустые списки на входе будут отброшены, но если вы породите пустые списки в качестве новых элементов, то условие их не коснётся.

Да и просто взглянув на само условие можно понять, чего оно касается:

[[y for y in x if y] for x in some_list if x]

if x проверяет истинность x, а никак не [y for y in x if y].

1

Сергей Гаранин

Aleksei Pirogov, а разве [y for y in x if y] в данной ситуации не один из элементов some_list.

0

Aleksei Pirogov

Нет, это новый список, создаваемый на основе y, который уже является элементом some_list.

0

Алексей Субач

и как решить эту проблему в таком случае?

0

Екатерина Митяшкина

Алексей Субач, можно через filter()пропустить полученный список. Только вот не знаю, насколько это соответсвует поставленной задаче.

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
25 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
25 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
25 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев