Не выводится второй список, функция map и filter. Python
Вывожу отфильтрованные числа чтобы видеть прогресс на каждом шаге, но почему не выводится второй? Почему список при выводе пуст?
numbers = [46, 61, 34, 17, 56, 26, 93, 1, 3, 82, 71, 37, 80, 27, 77, 94, 34, 100, 36, 81, 33, 81, 66, 83, 41, 80, 80, 93, 40, 34, 32, 16, 5, 16, 40, 93, 36, 65, 8, 19, 8, 75, 66, 21, 72, 32, 41, 59, 35, 64, 49, 78, 83, 27, 57, 53, 43, 35, 48, 17, 19, 40, 90, 57, 77, 56, 80, 95, 90, 27, 26, 6, 4, 23, 52, 39, 63, 74, 15, 66, 29, 88, 94, 37, 44, 2, 38, 36, 32, 49, 5, 33, 60, 94, 89, 8, 36, 94, 46, 33]
# числа ^
# with filter and map
# числа, с исключением нечётных чисел больших 47
filtered_numbers = filter(lambda num: not (num % 2 == 1 and num > 47), numbers)
print(list(filtered_numbers))
# оставшиеся числа пребираем, чётные делим нацело на 2, нечётные оставляем без изменений
mapped_numbers = map(lambda num: num // 2 if num % 2 == 0 else num, filtered_numbers)
print(list(mapped_numbers))
Вывод:
[46, 34, 17, 56, 26, 1, 3, 82, 37, 80, 27, 94, 34, 100, 36, 33, 66, 41, 80, 80, 40, 34, 32, 16, 5, 16, 40, 36, 8, 19, 8, 66, 21, 72, 32, 41, 35, 64, 78, 27, 43, 35, 48, 17, 19, 40, 90, 56, 80, 90, 27, 26, 6, 4, 23, 52, 39, 74, 15, 66, 29, 88, 94, 37, 44, 2, 38, 36, 32, 5, 33, 60, 94, 8, 36, 94, 46, 33]
[]
Ответы (1 шт):
Это связано с тем, что filter на выходе выдаёт объект класса generator.
А генераторы используют для того, чтобы не перегружать память информацией. Если же мы хотим сохранить её, нужно использовать списки, а не генераторы.
Вообще, генератор не хранит в себе элементы, а только последний элемент, правило для следующего, да условие остановки.
Т.е. в результате ленивых вычислений, которые проводит генератор, после его работы в объекте не останется ничего. Потому вы и получаете пустой список. Попробуйте написать просто mapped_numbers = filtered_numbers - при выводе на печать mapped_numbers вы получите пустой список.
Дополнительным выводом является понимание важности знания, что происходит "под капотом" при использовании тех или иных богатых возможностей языка.
Соответственно, в данном случае, нужно внести дополнительную переменную в ваш код. См.ниже работающий вариант.
numbers = [46, 61, 34, 17, 56, 26, 93, 1, 3, 82, 71, 37, 80, 27, 77, 94, 34, 100, 36, 81, 33, 81, 66, 83, 41, 80, 80, 93, 40, 34, 32, 16, 5, 16, 40, 93, 36, 65, 8, 19, 8, 75, 66, 21, 72, 32, 41, 59, 35, 64, 49, 78, 83, 27, 57, 53, 43, 35, 48, 17, 19, 40, 90, 57, 77, 56, 80, 95, 90, 27, 26, 6, 4, 23, 52, 39, 63, 74, 15, 66, 29, 88, 94, 37, 44, 2, 38, 36, 32, 49, 5, 33, 60, 94, 89, 8, 36, 94, 46, 33]
# числа ^
# with filter and map
# числа, с исключением нечётных чисел больших 47
filtered_numbers = filter(lambda num: not (num % 2 == 1 and num > 47), numbers)
# Вносим дополнительную переменную, чтобы сохранить данные
new_filtered_numbers = list(filtered_numbers)
print(new_filtered_numbers)
# оставшиеся числа пребираем, чётные делим нацело на 2, нечётные оставляем без изменений
mapped_numbers = map(lambda num: num // 2 if num % 2 == 0 else num, new_filtered_numbers)
print(list(mapped_numbers))