Python:生成范围内值的所有n长度数组合

mad*_*tyn 6 python arrays list-comprehension python-3.x

好.我正在寻找最聪明,更紧凑的方法来完成这项功能

def f():
    [[a,b,c] for a in range(6) for b in range(6) for c in range(6)]
Run Code Online (Sandbox Code Playgroud)

这应该生成值a,b,c的所有组合,如下所示:

[0,0,0]
[0,0,1]
[0,0,2]
...
[1,0,0]
[1,0,1]
...
Run Code Online (Sandbox Code Playgroud)

等等...

但我希望这是灵活的,所以我可以改变范围或可迭代,以及生成的数组的长度.范围很简单:

def f(min, max):
    [[a,b,c] for a in range(min,max) for b in range(min,max) for c in range(min,max)]
Run Code Online (Sandbox Code Playgroud)

对于3长度数组,这是可以的,但我现在考虑制作4长度数组或7长度数组,并在相同范围内为它们生成所有组合.

它必须以一种简单的方式存在,可能以某种方式连接数组或嵌套理解列表,但我的解决方案似乎过于复杂.

对不起这么长的帖子.

Mos*_*oye 6

你可以使用itertools.product:

from itertools import product

def f(mn, mx, n):
    return list(product(*[range(mn, mx)]*n)))
Run Code Online (Sandbox Code Playgroud)

丢弃list,返回发电机以提高内存效率.


MSe*_*ert 5

您可以使用itertools.product哪个只是嵌套迭代的便利函数.repeat如果你想重复iterable多次,它也有一个参数:

>>> from itertools import product

>>> amin = 0
>>> amax = 2
>>> list(product(range(amin, amax), repeat=3))
[(0, 0, 0), (0, 0, 1), (0, 1, 0),  (0, 1, 1),  (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
Run Code Online (Sandbox Code Playgroud)

要获得listlist,你可以使用map:

>>> list(map(list, product(range(amin, amax), repeat=3)))
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

然而product,它是一个迭代器,所以如果你只是迭代它而不是将它转换为一个迭代器它真的很有效list.至少如果你的程序可以做到这一点.例如:

>>> for prod in product(range(amin, amax), repeat=3):
...     print(prod)  # one example
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)
Run Code Online (Sandbox Code Playgroud)