Python代码:12个嵌套for循环真的是最好的答案吗?

时间:2018-01-08 02:05:15

标签: python loops nested

所以我玩了一个我有12件装备的游戏。每件装备(为了我的努力)都有四个我感兴趣的增益:力量,急速,致命伤害,临界等级。

我有一个公式,我可以输入总功率,急速,CD和CR,并产生每秒输出的预期伤害。

然而,并非每一件装备都有四个增益。目前我对两种情况感兴趣:只有四种情况中的一种的齿轮,以及四种中有三种的齿轮。

在第一个场景中,十二个装备中的每个装备上都有一个buff,可以是四个中的任何一个。我想要做的是编写一个程序,找出哪个排列输出的伤害最大。

那么我需要做的是编写一个程序,在这种情况下尝试每种可能的安排。如果我们认为十二件中的每一件都可以有四个值中的一个,那就是4 ^ 12个可能的测试安排 - 或者是16,777,216 - 对于一台机器来说很容易,对吗?

然而,我必须遍历所有这些安排,目前我只能想象12个嵌套的FOR循环,每个值为1-4,公式在中间。

在可读性和重复努力方面,这似乎是不太苛刻的。

是否有一种更好,更pythonic的方式来检查我的公式最喜欢哪个(产生最大伤害),或者是12个嵌套的FOR循环,看起来过多,这是最好也是最清晰的方式?

2 个答案:

答案 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的方式重写它,但这显示了原则。