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]
будет истинным.