Я искал все выше и ниже для понимания itertools.filterfalse без особой удачи для моих конкретных вопросов.
Вот сценарий: у меня есть набор из 48 объектов, и я использовал itertools.combination чтобы сгенерировать все комбинации из 9 объектов из этого набора.
Вопрос 1. Как подсчитать количество элементов в этом объекте itertools.combination, не преобразовав его в список? Документы itertools предоставляют формулу для этого (порядка порядка 2,1 миллиарда комбинаций), но мне любопытно узнать, существует ли какой-либо встроенный метод для возврата значения.
После генерации этих комбинаций из 48 -выбрать-9, я отфильтровал их с помощью функции itertools.filterfalse. Чтобы дать вам представление о том, насколько строг этот фильтр, когда я делаю ту же процедуру с 33-выбрать-7 комбинациями похожих объектов, осталось только 28. Итак, я ожидаю, что такое же небольшое количество значений при выполнении 48-choose-9.
Сценарий завершается за считанные секунды для 48-choose-9, и filterfalse возвращает отфильтрованные комбинации в переменная:
valid_combinations = itertools.filterfalse(
lambda combination: set([action for tile in combination for action in tile])
!= set(total_actions),
all_combinations,
)
valid_combinations
должен быть кратким списком, но мой компьютер работает несколько минут громко, ничего не возвращая, когда я пытаюсь:
valid_combinations = list(valid_combinations)
Вопрос 2: Как мне подсчитать количество элементов в объекте itertools.filterfalse, чтобы подтвердить, что это действительно управляемое число?
Вопрос 3: Как получить содержимое validCombitions объекта itertools.filterfalse без преобразования в список?
Вопрос 4. Есть ли лучшая альтернатива для фильтрации объекта itertools.combination такого размера?
Спасибо за любые идеи, которые вы можете отправить мне!