我该怎么做,但骰子数量可变?
How can I do this, but with a changeable number of dice?
如果骰子数量可变,我该怎么做?这意味着 all_dices
可以有任何长度。
for first_dice_number in all_dices[0]:
for second_dice_number in all_dices[1]:
for thrird_dice_number in all_dices[2]:
result = first_dice_number+second_dice_number+thrird_dice_number
results.append(result)
为了澄清,all_dices
看起来像:
[[1,2,3,4,5,6],[1,2,3,4,5,6],[1,2,3,4,5,6]]
这很可能是一个菜鸟问题,但我就是想不通。
问题是我不想将 100 个 for
循环放在彼此内部。
您想要一组值的(笛卡尔)积。
from itertools import product
results = [sum(numbers) for numbers in product(*all_dices)]
例如:
>>> list(product([1,2,3], [1,2,3,4]))
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4)]
递归就是为了那些东西,在一个函数里放一个循环,一直调用自己直到没有骰子
all_dices=[range(1,6),range(1,6),range(1,6),range(1,6)]
def flip(dicenum,totaluntilhere):
if dicenum>len(all_dices)
results.append(totaluntilhere+all_dices[dicenum]
else
for dice in all_dices[dicenum+1]:
flip(dicenum+1,totaluntilhere+dice)
flip(-1,0)
我不太擅长python,但就是这样
itertools
解决方案可能是 Python 中最好的解决方案,但处理骰子的另一种方法是考虑枚举 n
骰子的可能掷数,从 0 到 6^ n -1 以 6 为基数(但使用 "digits" 1 到 6 而不是 0 到 5):
def decode(dice_code, num_dice):
dice = []
for _ in range(num_dice):
dice_code,r = divmod(dice_code,6)
dice.append(1+r)
return dice
例如,decode(0,5)
是 [1,1,1,1,1]
,decode(7775,5)
是 [6,6,6,6,6]
。只需循环 range(6**n)
,根据需要解码。
如果骰子数量可变,我该怎么做?这意味着 all_dices
可以有任何长度。
for first_dice_number in all_dices[0]:
for second_dice_number in all_dices[1]:
for thrird_dice_number in all_dices[2]:
result = first_dice_number+second_dice_number+thrird_dice_number
results.append(result)
为了澄清,all_dices
看起来像:
[[1,2,3,4,5,6],[1,2,3,4,5,6],[1,2,3,4,5,6]]
这很可能是一个菜鸟问题,但我就是想不通。
问题是我不想将 100 个 for
循环放在彼此内部。
您想要一组值的(笛卡尔)积。
from itertools import product
results = [sum(numbers) for numbers in product(*all_dices)]
例如:
>>> list(product([1,2,3], [1,2,3,4]))
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4)]
递归就是为了那些东西,在一个函数里放一个循环,一直调用自己直到没有骰子
all_dices=[range(1,6),range(1,6),range(1,6),range(1,6)]
def flip(dicenum,totaluntilhere):
if dicenum>len(all_dices)
results.append(totaluntilhere+all_dices[dicenum]
else
for dice in all_dices[dicenum+1]:
flip(dicenum+1,totaluntilhere+dice)
flip(-1,0)
我不太擅长python,但就是这样
itertools
解决方案可能是 Python 中最好的解决方案,但处理骰子的另一种方法是考虑枚举 n
骰子的可能掷数,从 0 到 6^ n -1 以 6 为基数(但使用 "digits" 1 到 6 而不是 0 到 5):
def decode(dice_code, num_dice):
dice = []
for _ in range(num_dice):
dice_code,r = divmod(dice_code,6)
dice.append(1+r)
return dice
例如,decode(0,5)
是 [1,1,1,1,1]
,decode(7775,5)
是 [6,6,6,6,6]
。只需循环 range(6**n)
,根据需要解码。