确定。我正在寻找最聪明,更紧凑的方式来完成这项功能
def f():
[[a,b,c] for a in range(6) for b in range(6) for c in range(6)]
应生成值a,b,c的所有组合,如下所示:
[0,0,0]
[0,0,1]
[0,0,2]
...
[1,0,0]
[1,0,1]
...
依旧......
但我希望这是灵活的,所以我可以改变范围或可迭代,以及生成的数组的长度。范围很简单:
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)]
这适用于3长度阵列,但我现在考虑制作4长度数组或7长度数组,并在相同范围内为它们生成所有组合。
它必须以一种简单的方式存在,可能以某种方式连接数组或嵌套理解列表,但我的解决方案似乎过于复杂。
抱歉这么长的帖子。
答案 0 :(得分:6)
您可以使用itertools.product
:
from itertools import product
def f(mn, mx, n):
return list(product(*[range(mn, mx)]*n)))
删除list
,返回生成器以提高内存效率。
答案 1 :(得分: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)]
要获得list
list
,您可以使用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]]
但是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)
答案 2 :(得分:1)
itertools 拥有您需要的一切。 combinations_with_replacement 将生成给定长度的组合,其中包含来自给定iterable的重复元素。请注意,返回的值将是迭代器。
def f(min, max, num):
return itertools.combinations_with_replacement(range(min, max), num)
答案 3 :(得分:1)
纯python实现:
k=2 # k-uples
xmin=2
xmax=5
n=xmax-xmin
l1 = [x for x in range(n**k)]
l2 = [[ x//n**(k-j-1)%n for x in l1] for j in range(k)]
l3 = [[ xmin + l2[i][j] for i in range(k)] for j in range(n**k)]
l3
是:
[[2 2]
[2 3]
[2 4]
[3 2]
[3 3]
[3 4]
[4 2]
[4 3]
[4 4]]
答案 4 :(得分:-1)
您正在寻找的是范围的笛卡尔积。幸运的是,这已存在于itertools
中import itertools
print(list(itertools.product(range(0,5), range(0,5), range(0,5))))