Отфильтруй список по истинности и наличию элементов во втором списке

20. Отфильтруй список по истинности и наличию элементов во втором списке

Условие задачи Нужно сказать результат выполнения кода ниже и объяснить как он работает

a = ['a', 'b', 3, 'true', True, 1, 0]
b = ['0', 1, 3, 5, 7]

c = [x for x in a if x and x in b]

print(f"{c = }")
Спойлеры к решению
Подсказки
  • Список c собирается через list comprehension.
  • В результат попадут только те элементы x, для которых условие x and x in b истинно.
  • Сначала проверяется истинность самого x.
  • Если x ложный, проверка x in b уже не выполняется.
  • В Python число 0 является ложным значением.
  • В Python True == 1, поэтому True in b вернёт True, так как в списке b есть число 1.
Решение
a = ['a', 'b', 3, 'true', True, 1, 0]
b = ['0', 1, 3, 5, 7]

c = [x for x in a if x and x in b]

print(f"{c = }")

Результат:

c = [3, True, 1]

Разбор по элементам:

'a'    -> truthy, но 'a' нет в b          -> не попадает
'b'    -> truthy, но 'b' нет в b          -> не попадает
3      -> truthy и 3 есть в b             -> попадает
'true' -> truthy, но 'true' нет в b       -> не попадает
True   -> truthy и True == 1, а 1 есть в b -> попадает
1      -> truthy и 1 есть в b             -> попадает
0      -> falsy                           -> не попадает

Ключевой момент здесь — проверка:

x and x in b

Она означает: сначала проверить, является ли x истинным значением, и только потом проверить наличие x в списке b.

Элемент 0 не попадает в результат, потому что 0 является ложным значением.

Элемент True попадает в результат, потому что в Python:

True == 1

поэтому выражение:

True in [0, 1, 3, 5, 7]

будет истинным.