/ / Python code: 12 loops aninhados são realmente a melhor resposta? - python, loops, aninhados

Código Python: Os 12 loops aninhados são realmente a melhor resposta? - python, loops, aninhados

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 № 1

Use 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.