如何在給定每個變量的域的情況下生成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
如何在給定每個變量的域的情況下生成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
>>> 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)]
的itertools.product
功能爲你的國家不需要「固定域」,也不做任何功能。
例如這段代碼你想要做什麼:
a = [2, 3]
b = [1]
c = [1, 2, 3]
print(itertools.product(a, b, c))
,並會爲任何一組任意長度的序列做同樣的。
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
你是指組合而不是排列? – hruske
我認爲OP意味着[笛卡爾產品](https://docs.python.org/3/library/itertools.html#itertools.product) – rici