Вопрос №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
Сергей, приветствую!
Почему вложенным циклом корректно убираются False значения, а дальше пустые списки не отсеиваются НО здесь убирает:
Пустые списки отфильтровываются благодаря условию if x
, так как пустой список приводится к False
, потому условие if x
не выполняется. Вы можете убедиться в этом выполнив в REPL приведение bool([])
. В первом же случае сами списки не отфильтровываются потому как они не пустые и приводятся к логическому значению True
. Например, попробуйте выполнить в REPLbool([0, ""])
. Но уже далее с помощью второго цикла и условия if y
мы отфильтровываем элементы самого списка, и если они приводятся к логическому значению False, то добавлены в список не будут. Но сам список то уже добавлен, потому на выходе и получается пустой список.
еще не понимаю как работает это :
Попробуйте в REPL каждое из значений привести к логическому с помощью bool(value). Так сразу станет понятно почему условные выражения истинны или ложные.
Сергей Гаранин, единица равна 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]
.
Aleksei Pirogov, а разве [y for y in x if y] в данной ситуации не один из элементов some_list.
Нет, это новый список, создаваемый на основе y
, который уже является элементом some_list
.
и как решить эту проблему в таком случае?
Алексей Субач, можно через filter()
пропустить полученный список. Только вот не знаю, насколько это соответсвует поставленной задаче.
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







