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)。知道产品需要转换为列表可以回答我的问题,谢谢。我考虑了用循环过乘积替换嵌套循环的含义。