2016-02-28 9 views
0

Как сгенерировать перестановки из n переменных, заданных в области каждой переменной. (в python)генерировать декартово произведение n наборов

Я знаю об itertools, но для этого требуется фиксированный домен для перестановок, чтобы он не работал. Также есть ли библиотека python, которая делает это? Благодарю.

В основном: давалось 3 переменными: А с доменом (2,3) B с доменом (1) C с доменом (1,2,3)

Как вы генерировать все перестановки ABC ?

2,1,1 
3,1,1 
2,1,2 
3,1,2 
2,1,3 
3,1,3 
+0

Вы имеете в виду комбинации, а не перестановки? – hruske

+2

Я думаю, что OP означал [декартовой продукт] (https://docs.python.org/3/library/itertools.html#itertools.product) – rici

ответ

4
>>> list(itertools.product((2, 3), (1,), (1, 2, 3))) 
[(2, 1, 1), (2, 1, 2), (2, 1, 3), (3, 1, 1), (3, 1, 2), (3, 1, 3)] 
1

itertools.product функция не требует «фиксированной области», как вы утверждаете, и не какие-либо функции.

Например, этот код делает то, что вы хотите:

a = [2, 3] 
b = [1] 
c = [1, 2, 3] 
print(itertools.product(a, b, c)) 

и будет делать то же самое для любого набора последовательностей любой длины.

1

itertools.product был должным образом предложен и отлично подходит для решения проблемы. Если вы - если только по академическим соображениям - заинтересованы в выборочной реализации, то здесь есть функция генератора:

def cartesian_product(*lists): # lists can really be any sequences 
    if any([not l for l in lists]): # c.p. is empty if any list is empty 
     return 

    n = len(lists) 
    indexes = [0] * n 

    while True: 
     yield tuple(lists[i][indexes[i]] for i in xrange(n)) # currently indexed element of each list 
     # update indexes 
     for i in xrange(n-1, -1, -1): # loop through indexes from back 
      if indexes[i] < len(lists[i]) - 1:  # stop at first index that can be incremented ... 
       indexes[i] += 1      # ... increment it ... 
       indexes[i+1:n] = [0] * (n - i - 1) # ... reset all succeeding indexes to 0 
       break 
     else: # no index could be incremented -> end 
      break 
Смежные вопросы