Лучший способ преобразовать объект itertools.filterfalse в список - PullRequest
0 голосов
/ 20 февраля 2020

Я искал все выше и ниже для понимания 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 такого размера?

Спасибо за любые идеи, которые вы можете отправить мне!

...