Digamos que eu tenho uma lista Python representando intervalos para algumas variáveis:
conditions = [['i', (1, 5)], ['j', (1, 2)]]
Isso representa que a variável i
varia de 1 a 5 e, dentro desse loop, a variável j
varia de 1 a 2. Quero um dicionário para cada combinação possível:
{'i': 1, 'j': 1}
{'i': 1, 'j': 2}
{'i': 2, 'j': 1}
{'i': 2, 'j': 2}
{'i': 3, 'j': 1}
{'i': 3, 'j': 2}
{'i': 4, 'j': 1}
{'i': 4, 'j': 2}
{'i': 5, 'j': 1}
{'i': 5, 'j': 2}
A razão é que eu quero iterar sobre eles. Mas como todo o espaço é muito grande, não quero gerar todos eles, armazená-los e iterar sobre essa lista de dicionários. Pensei em usar o seguinte procedimento recursivo, mas preciso de ajuda com a yield
parte. Onde deveria estar? Como evito geradores aninhados?
def iteration(conditions, currentCondition, valuedIndices):
if currentCondition == len(conditions):
yield valuedIndices
else:
cond = conditions[currentCondition]
index = cond[0]
lim1 = cond[1][0]
lim2 = cond[1][1]
for ix in range(lim1, lim2 + 1):
valuedIndices[index] = ix
yield iteration(conditions, currentCondition + 1, valuedIndices)
Agora eu gostaria de poder fazer:
for valued_indices in iteration(conditions, 0, {}):
...
yield
poryield from
na última linha da sua função.