我需要找出总共35(m)的10个骰子(n)的所有排列。我是python的新手,并且陷入了for循环。这是我到目前为止所得到的:
import itertools
dice = [1,2,3,4,5,6]
def subsets(n,m):
perms = itertools.permutations(dice,n)
for i in perms:
if sum(i) == m
yield perms
else:
return
print(list(subsets(10,35)))
答案 0 :(得分:2)
第一个问题是你不想要排列。排列不包括重复(即每个骰子滚动不同的数字)。没有10个骰子的排列。
这应该是product
(如果您想以不同方式计算(1,1,1,1,1,2)
和(1,1,1,1,2,1)
)或combinations_with_replacement
(如果您不是)。我假设后者*。
然后,这里出现语法错误:
if sum(i) == m
yield perms
应该有一个冒号和一个缩进的块。此外,它应该可能产生当前项目(i
):
if sum(i) == m:
yield i
这没有任何作用,因为函数无论如何都会完成:
else:
return
因此,该函数的固定版本将是:
def subsets(n,m):
perms = itertools.combinations_with_replacement(dice, n)
for i in perms:
if sum(i) == m:
yield i
当然,这可以简化为:
def subsets(n,m):
return (p for p in itertools.combinations_with_replacement(dice,n) if sum(p) == m)
*请注意,对于product
,subsets(10,35)
会产生4395456个结果,而使用combinations_with_replacement
会得到141个结果。
答案 1 :(得分:0)
from itertools import product
dice = [1, 2, 3, 4, 5, 6]
def subsets(n, m):
for i in product(dice, repeat=n):
if sum(i) == m:
yield i
因此,您的代码中存在各种问题:
itertools.product
才能获得N个骰子的可能组合。答案 2 :(得分:0)
除了要使用的itertools函数外,Dalvenjia有正确的想法。如果您想掷出n
骰子,则需要使用itertools.product(dice, repeat=n)
。
答案 3 :(得分:0)
我认为当掷出一定数量的骰子以获得特定总数时,您需要所有排列。
from itertools import product
dices, total = 10, 35
print([p for p in product(list(range(1,7)), repeat = dices) if sum(p)==total])