生成n组的笛卡尔积

时间:2016-02-28 00:59:23

标签: python variables permutation

如何在给定每个变量的域的情况下生成n个变量的排列。 (在python中)

我知道itertools,但这需要一个固定的域来进行排列,这样才能胜任。还有一个python库这样做吗?感谢。

基本上: 给出3个变量: A与域(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

3 个答案:

答案 0 :(得分: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 :(得分:1)

itertools.product函数在您声明时不需要“固定域”,也不需要任何函数。

例如,此代码可以满足您的需求:

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

并且对任何长度的任何序列集都会这样做。

答案 2 :(得分: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