所以我玩了一个我有12件装备的游戏。每件装备(为了我的努力)都有四个我感兴趣的增益:力量,急速,致命伤害,临界等级。
我有一个公式,我可以输入总功率,急速,CD和CR,并产生每秒输出的预期伤害。
然而,并非每一件装备都有四个增益。目前我对两种情况感兴趣:只有四种情况中的一种的齿轮,以及四种中有三种的齿轮。
在第一个场景中,十二个装备中的每个装备上都有一个buff,可以是四个中的任何一个。我想要做的是编写一个程序,找出哪个排列输出的伤害最大。
那么我需要做的是编写一个程序,在这种情况下尝试每种可能的安排。如果我们认为十二件中的每一件都可以有四个值中的一个,那就是4 ^ 12个可能的测试安排 - 或者是16,777,216 - 对于一台机器来说很容易,对吗?
然而,我必须遍历所有这些安排,目前我只能想象12个嵌套的FOR循环,每个值为1-4,公式在中间。
在可读性和重复努力方面,这似乎是不太苛刻的。
是否有一种更好,更pythonic的方式来检查我的公式最喜欢哪个(产生最大伤害),或者是12个嵌套的FOR循环,看起来过多,这是最好也是最清晰的方式?
答案 0 :(得分:1)
使用迭代器替换for-loop:
keys = ['p', 'h', 'cd', 'cr']
iter_keys = itertools.product(*([keys] * 12))
for item in iter_keys:
print item
输出:
('p', 'p', 'p', 'p', 'p', 'cr', 'cd', 'h', 'cr', 'p', 'h', 'cr')
('p', 'p', 'p', 'p', 'p', 'cr', 'cd', 'h', 'cr', 'p', 'cd', 'p')
('p', 'p', 'p', 'p', 'p', 'cr', 'cd', 'h', 'cr', 'p', 'cd', 'h')
('p', 'p', 'p', 'p', 'p', 'cr', 'cd', 'h', 'cr', 'p', 'cd', 'cd')
('p', 'p', 'p', 'p', 'p', 'cr', 'cd', 'h', 'cr', 'p', 'cd', 'cr')
....
('cr', 'cr', 'cr', 'cr', 'cr', 'cr', 'cr', 'cr', 'cr', 'cr', 'cr', 'cr')
答案 1 :(得分:0)
如果你有12个嵌套for循环,你可能需要这样的递归设计:
def loops (values, num, current_list):
if num > 0:
for v in values:
loops(values, num-1, current_list+list(v))
else:
print current_list
loops (('a', 'b', 'c', 'd'), 12, [])
然后,你可能会像Mad Lee的那样以pythonic的方式重写它,但这显示了原则。