Python中的多范围产品

Python中的多范围产品,python,range,generator,permutation,Python,Range,Generator,Permutation,有没有更好的方法来做到这一点: perms = product(range(1,7),range(1,7),range(1,7)) 这样我可以选择使用多少范围? 我希望它与此等效,但可扩展 def dice(num) if num == 1: perms = ((i,) for i in range(1,7)) elif num == 2: perms = product(range(1,7),range(1,7)) elif num =

有没有更好的方法来做到这一点:

perms = product(range(1,7),range(1,7),range(1,7))
这样我可以选择使用多少范围? 我希望它与此等效,但可扩展

def dice(num)
    if num == 1:
        perms = ((i,) for i in range(1,7))
    elif num == 2:
        perms = product(range(1,7),range(1,7))
    elif num == 3:
        perms = product(range(1,7),range(1,7),range(1,7))
    #... and so on
但我知道一定有更好的办法。 我用它来计算骰子的结果。 实际代码

def dice(selection= lambda d: d[2]):   
    perms = itertools.product(range(1,7),range(1,7),range(1,7))      
    return collections.Counter(((selection(sorted(i)) for i in perms)))
我可以用各种选择器调用它,比如
sum(d[0:2])
来计算最低2个骰子的总和,或者
d[1]
来计算中间的骰子。

我想

perms = itertools.product(*([xrange(1,7)]*num))
应该对你有用。

我想

perms = itertools.product(*([xrange(1,7)]*num))

应该适合你。

是的。使用
repeat
关键字参数:

perms = product(range(1, 7), repeat=3)

有关详细信息,请参阅。

是。使用
repeat
关键字参数:

perms = product(range(1, 7), repeat=3)

有关详细信息,请参阅。

哦,我怎么会错过这个?我甚至在那个医生页面上。facepalm谢谢有点关系:如果使用
irange
,有什么区别吗?我的
产品的范围很大。@Annan:多大
itertools.product
确实会立即在内部将其每个参数转换为一个列表,因此即使在Python 3中
range
是惰性的,您也可以期望
perms=itertools.product(range(10**9))
在开始迭代
perms
之前花费大量的时间和内存。OTOH,
itertools.product(范围(100),repeat=100)
应该可以,因为它只在前面生成100个长度为100的列表。(我不熟悉
irange
,但我想你指的是类似于python3的
range
)是的,我指的是惰性范围。我有点混淆了(I/x/)范围py(2/3)。知道产品需要转换为列表可以回答我的问题,谢谢。我考虑过用循环过的产品替换嵌套循环的含义。哦,我是怎么错过的?我甚至在那个医生页面上。facepalm谢谢有点关系:如果使用
irange
,有什么区别吗?我的
产品的范围很大。@Annan:多大
itertools.product
确实会立即在内部将其每个参数转换为一个列表,因此即使在Python 3中
range
是惰性的,您也可以期望
perms=itertools.product(range(10**9))
在开始迭代
perms
之前花费大量的时间和内存。OTOH,
itertools.product(范围(100),repeat=100)
应该可以,因为它只在前面生成100个长度为100的列表。(我不熟悉
irange
,但我想你指的是类似于python3的
range
)是的,我指的是惰性范围。我有点混淆了(I/x/)范围py(2/3)。知道产品需要转换为列表可以回答我的问题,谢谢。我考虑了用循环过乘积替换嵌套循环的含义。