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 i
varía de 1 a 5, y dentro de esa variable de bucle j
varí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 yield
parte. 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, {}):
...
yield
conyield from
en la última línea de su función.