/ / Codice Python: 12 loop nidificati sono la risposta migliore? - python, loop, nidificati

Codice Python: i 12 loop nidificati sono la risposta migliore? - python, loop, nidificati

Quindi gioco a un gioco in cui ho 12 pezzi di equipaggiamento. Ogni pezzo di equipaggiamento (ai fini del mio sforzo) ha quattro buff che mi interessano: potenza, celerità, danno critico, valutazione critica.

Ho una formula in cui posso inserire la potenza totale, la rapidità, il CD e il CR e generare il danno atteso al secondo.

Tuttavia, non tutti i componenti hanno tutti e quattro i buff. Attualmente sono interessato a due scenari: equipaggiamento che ha solo uno dei quattro e equipaggiamento che ne ha tre dei quattro.

Nel primo scenario, ognuno dei dodici pezzidi equipaggiamento avrà un singolo buff su di esso che può essere uno qualsiasi dei quattro. Quello che voglio fare è scrivere un programma che trovi quale disposizione produce il maggior danno.

Quindi quello che devo fare è scrivere un programmaprova ogni possibile sistemazione in questo scenario. Se calcoliamo che ognuno dei dodici pezzi può avere uno dei quattro valori, che è 4 ^ 12 possibili accordi da testare - o 16,777,216 - facile-pisello per una macchina, giusto?

Tuttavia devo seguire tutte queste disposizioni, e al momento posso solo immaginare 12 cicli FOR forati annidati di valore 1-4 ciascuno, con la formula nel mezzo.

Questo sembra non-pythonic in termini di leggibilità e solo duplicazione degli sforzi.

C'è un modo migliore, più platonico, per verificare quale sia la mia formula che si adatta meglio (genera un danno massimo), o 12 cicli FOR annidati, per quanto eccessivi come sembra, il modo migliore e più chiaro?

risposte:

1 per risposta № 1

Usa iteratore per sostituire for-loop:

keys = ["p", "h", "cd", "cr"]
iter_keys = itertools.product(*([keys] * 12))
for item in iter_keys:
print item

Produzione:

("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 per risposta № 2

Se hai 12 loop nidificati, probabilmente hai bisogno di un design ricorsivo come questo:

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, [])

Quindi, probabilmente lo riscriveresti in modo pandemonico come quello di Mad Lee, ma questo mostra il principio.