2010-11-11 18 views
6

Para mis clientes, iterar a través de varios contadores se está convirtiendo en una tarea recurrente.Python: Contadores de anidamiento

La forma más sencilla sería algo como esto:

cntr1 = range(0,2) 
cntr2 = range(0,5) 
cntr3 = range(0,7) 

for li in cntr1: 
    for lj in cntr2: 
     for lk in cntr3: 
      print li, lj, lk 

El número de contadores puede estar en cualquier lugar entre el 3 y el anidado de los bucles comience a tomar por el sector inmobiliario.

¿Hay alguna manera pitonica de hacer algo como esto?

for li, lj, lk in mysteryfunc(cntr1, cntr2, cntr3): 
    print li, lj, lk 

no dejo de pensar que algo en itertools encajaría este proyecto de ley, pero yo no soy lo suficientemente familiarizado con itertools de dar sentido a las opciones. ¿Ya hay una solución como itertools, o tengo que hacer la mía?

Gracias, j

Respuesta

7

Lo que queremos es itertools.product

for li, lj, lk in itertools.product(cntr1, cntr2, cntr3): 
    print li, lj, lk 

hará exactamente lo que está solicitando. El nombre deriva del concepto de producto cartesiano.

+0

Excelente. Gracias, Winston. –

+0

Además (en caso de que alguien con un problema ligeramente diferente llegue aquí): Supongamos que tiene una matriz 'cntr = [cntr1, cntr2, cntr3]'. Entonces, llamar a 'itertools.product (cntr)' no funcionará. (Simplemente imprime todas las 1-tuplas donde el primer elemento es un elemento de 'cntr'; efectivamente imprime' cntr'.) En su lugar, puede hacer 'itertools.product (* cntr)'. – ShreevatsaR