Então eu jogo um jogo em que eu tenho 12 peças de equipamento. Cada peça de equipamento (para os propósitos do meu esforço) tem quatro buffs nos quais estou interessado: poder, ímpeto, dano crítico, classificação crítica.
Eu tenho uma fórmula em que eu posso inserir o poder total, pressa, CD e CR e gerar o dano esperado por segundo de saída.
No entanto, nem toda peça de equipamento tem todos os quatro buffs. Atualmente estou interessado em dois cenários: equipamento que possui apenas um dos quatro e engrenagem que possui três dos quatro.
No primeiro cenário, cada uma das doze peçasde engrenagem terá um único buff nele que pode ser qualquer um dos quatro. O que eu quero fazer é escrever um programa que descubra qual arranjo produz mais dano.
Então, o que eu preciso fazer é escrever um programa quetenta todos os arranjos possíveis neste cenário. Se nós descobrirmos que cada uma das doze peças pode ter um dos quatro valores, isso é 4 ^ 12 disposições possíveis para testar - ou 16.777.216 - easy-peasy para uma máquina, certo?
No entanto, eu tenho que percorrer todos esses arranjos, e no momento eu só posso imaginar 12 loops FOR aninhados de valor 1 a 4 cada, com a fórmula no meio.
Isto parece não-pythonic em termos de legibilidade e apenas duplicação de esforços.
Existe uma maneira melhor, mais pythonic para verificar qual a minha fórmula mais gosta (gera dano máximo), ou é 12 loops for aninhados, tão excessivo quanto parece, o melhor e mais claro caminho?
Respostas:
1 para resposta № 1Use o iterador para substituir o loop:
keys = ["p", "h", "cd", "cr"]
iter_keys = itertools.product(*([keys] * 12))
for item in iter_keys:
print item
Saída:
("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")
0 para resposta № 2
Se você tiver 12 loops aninhados, provavelmente precisará de um design recursivo como este:
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, [])
Então, você provavelmente irá reescrevê-lo de uma forma pít tica como a de Mad Lee, mas isso mostra o princípio.