2016-02-28 132 views
0

如何在給定每個變量的域的情況下生成n個變量的排列。 (在python中)生成n套笛卡爾乘積

我知道itertools,但這需要一個固定的域用於排列,所以不起作用。還有一個這樣做的Python庫嗎?謝謝。

基本上: 鑑於3個變量: 甲帶域(1) 下用域域(2,3) B(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