Digamos que tengo una lista de Python que representa rangos para algunas variables:
conditions = [['i', (1, 5)], ['j', (1, 2)]]
Esto representa que la variable ivaría de 1 a 5, y dentro de esa variable de bucle jvaría de 1 a 2. Quiero un diccionario para cada combinación posible:
{'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}
La razón es que quiero iterar sobre ellos. Pero debido a que todo el espacio es demasiado grande, no quiero generarlos todos, almacenarlos y luego iterar sobre esa lista de diccionarios. Pensé en usar el siguiente procedimiento recursivo, pero necesito ayuda con la yieldparte. Donde debe ser ¿Cómo evito los generadores anidados?
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)
Ahora me gustaría poder hacer:
for valued_indices in iteration(conditions, 0, {}):
...
yieldconyield fromen la última línea de su función.