所有可能的矩阵(列表列表)仅包含来自原始列表元素python的元素

时间:2015-12-24 21:03:17

标签: python algorithm python-2.7 matrix

我需要在没有像numpy数组这样的外部库的帮助下生成这个 我在5 * 5矩阵上有N = 5的大小,并且元素的原始列表可以说:

elements = [1,2,3]

我想生成此网格的所有可能排列(5 * 5):

例如N = 5

[[1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
]  

[[2,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
] 

[[3,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
] 

[[1,2,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
] 

[[2,2,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
] 

[[3,2,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
] 

[[1,3,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1,1,1],
] 

...

[[2,3,3,3,3],
 [3,3,3,3,3],
 [3,3,3,3,3],
 [3,3,3,3,3],
 [3,3,3,3,3],
]

[[3,3,3,3,3],
 [3,3,3,3,3],
 [3,3,3,3,3],
 [3,3,3,3,3],
 [3,3,3,3,3],
]

如果尽可能最有效,我可以生成这个。
已经在网格上尝试itertools.permutations 我改为N = 5,因为元素的数量少于适合行的数量,这样就更难了。

3 个答案:

答案 0 :(得分:1)

在Python中,这种类型的迭代器称为product

from itertools import product
N=2
elements = [1,2,3]
B=product(elements,repeat=N)
for c in product(B,repeat=N):
    print c

打印

((1, 1), (1, 1))
((1, 1), (1, 2))
((1, 1), (1, 3))
((1, 1), (2, 1))
((1, 1), (2, 2))
((1, 1), (2, 3))
((1, 1), (3, 1))
((1, 1), (3, 2))
...
((3, 3), (3, 1))
((3, 3), (3, 2))
((3, 3), (3, 3))

第一个产品生成B:迭代器,用于由元素构成的单个行的所有选择。 然后第二个产品在由B中的行构成的矩阵的所有选项上产生一个迭代器。

答案 1 :(得分:1)

您也可以使用itertools.combinations_with_replacement()

示例:

import itertools

def get_matrices( elements, N ):
    rows = itertools.combinations_with_replacement( elements, N )
    result = itertools.combinations_with_replacement( rows, N )
    return list(result)

matrices = get_matrices( [1,2], 2 )

for matrix in matrices:
    print matrix

<强>输出:

((1, 1), (1, 1))
((1, 1), (1, 2))
((1, 1), (2, 2))
((1, 2), (1, 2))
((1, 2), (2, 2))
((2, 2), (2, 2))

答案 2 :(得分:1)

你可以这样做: 将N×N矩阵解释为集合{1,2,... M}中的N²个元素的单个列表。

现在,您可以将此列表解释为基数M(将M解释为0)

e.g. (N=3, M=3)
1 2 2 
3 1 2
2 1 1

是列表122312211是号码122012211(基数3)

所以你可以简单地从0 to (M^N²) -1算起来生成所有可能的N²数字(基数为M)

e.g. N=3 M=3

0000000000
0000000001
0000000002
0000000010
0000000011
0000000012
0000000020
...
2222222221
2222222222

这个数字中的每一个都可以写成3×3矩阵。 e.g。

210211001是矩阵(3 == 0 so)

2 1 3
2 1 1
3 3 1

通过这种方式,您可以获得所有可能的N x N网格,其中包含{1,2 .. M}

中的元素