Как я могу сгенерировать декартово произведение нескольких переменных, используя итераторы Python? - PullRequest
1 голос
/ 25 октября 2010

Дорогие все, учитывая переменную, которая принимает, скажем, три значения, я пытаюсь сгенерировать все возможные комбинации, скажем, триплетов этих переменных.

В то время как этот код делает свое дело,

site_range=[0,1,2]
states = [(s0,s1,s2) for s0 in site_range for s1 in site_range for s2 in site_range]

это немного, эм, неуклюже, и становится только хуже, если я пытаюсь сделать то же самое для комбинаций более трех переменных

Следовательно, мои вопросы по Python 101:

  1. Как мне переписать код выше с использованием итераторов?Я имею в виду, возможно ли иметь итератор, который выдает элементы «состояний» выше?

  2. Можно ли расширить это для генерации не только триплетов, но и 4-складки, 5 складок и так далее?

Ответы [ 2 ]

4 голосов
/ 25 октября 2010
import itertools
site_range=[0,1,2]
[x for x in itertools.product(site_range, repeat=len(site_range))]
3 голосов
/ 25 октября 2010

Использование itertools.product:

>>> site_range=[0,1]
>>> list(product(site_range, repeat=3))
[000 001 010 011 100 101 110 111]

Редактировать Как @Glenn Maynard указывает в комментарии, это не декартово произведение. Для этого вам нужно будет проверить его ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...