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



所以我玩一个游戏,我有12件装备。每件装备(出于我的努力目的)都有四个我感兴趣的增益:力量、急速、暴击伤害、暴击等级。

我有一个公式,我可以在其中输入总功率、加速、CD 和 CR,并生成每秒的预期伤害输出。

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

在第一种情况下,十二件装备中的每一件都会有一个增益,可以是四个中的任何一个。我想做的是编写一个程序,找出哪种排列输出的损害最大。

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

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

就可读性和重复工作而言,这似乎不是pythonic。

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

使用迭代器替换 for 循环:

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')

如果你有 12 个嵌套的循环,你可能需要一个这样的递归设计:

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

相关内容

最新更新