Как получить все комбинации из нескольких списков с дополнительной фильтрацией?

#python #python-3.x #itertools

Вопрос:

 a = [[1,2,3,4],[2,3,4,5],[5,6,7,8],[4,3,2,3]] output: (1,2,5,4),(1,2,5,3),(1,2,5,2)...  

У меня есть несколько списков, в которых я пытаюсь найти все возможные комбинации, похожие на приведенный выше код. Однако из-за большого количества списков и количества элементов в списке мой компьютер не может его обработать. Поэтому мне было интересно, есть ли способ отфильтровать некоторые комбинации, сложив все элементы(числа) вместе. например: (1,2,5,4) = 12; А затем, если общее количество в этом списке меньше 15, удалите этот список и перейдите к следующей комбинации. Мне все равно пришлось бы сделать что-то подобное после того, как я получил все комбинации, поэтому я подумал, почему бы не сделать это раньше.

Мой код, который генерирует все возможные комбинации:

 list(itertools.product(*a))  

Есть какие-нибудь идеи о том, как я могу реализовать эту концепцию фильтрации?

Ответ №1:

Вы можете использовать понимание списка:

 from itertools import product  a = [[1,2,3,4],[2,3,4,5],[5,6,7,8],[4,3,2,3]]  l = [e for e in product(*a) if sum(e) gt; 15]  

Однако имейте в виду, что создание исходных продуктов может быть узким местом. Если у вас слишком много элементов (в вашем примере всего 256), существует вероятность того, что ваш компьютер никогда не сможет сгенерировать их все, и фильтрация ничего не изменит.